SQL分頁、多表聯合、多表聯合分頁


1.SQL分頁

with Row as
(
select jyid=ROW_NUMBER() over(order by OverTime),*from TYcOverLogs 
) 
select top 2 * from Row where jyid not in (select top 0 jyid from Row order by jyid)order by jyid

其中,jyid是一個虛擬的int變量,目的是為了給表添加一個虛擬的int編號,方便分頁;而 OverTime則是分頁依據的字段,因為有的時候,有的人的建表習慣未必會添加一個int型的主鍵作為標序。

以上語句是一個標准的分頁語句,第一個top后面的數字為pagesize,第二個top后面的數據是第幾頁開始的序號,可以直接套用,如下:

 #region 獲取分頁內容
        /// <summary>
        /// 獲取分頁內容
        /// </summary>
        /// <param name="PageIndex"></param>
        /// <param name="PageSize"></param>
        /// <returns></returns>
        public static List<TRgzwLogs> GetPageContent(int PageIndex, int PageSize)
        {

            List<TRgzwLogs> rgzwlogs = new List<TRgzwLogs>();
            try
            {
                StringBuilder strSql = new StringBuilder();
                string tabName, PKfld;
                tabName = "TRgzwLogs";//主表名
                PKfld = "CreateTime";//排序參照字段

                strSql.Append("with Row as ");
                strSql.Append(" ( ");
                strSql.Append(" select jyid=ROW_NUMBER() over(order by " + PKfld + " desc ),*from " + tabName);
                strSql.Append(" ) ");
                strSql.Append(" select top " + PageSize.ToString() + " * from Row ");
                strSql.Append(" where jyid not in (select top " + (PageSize * (PageIndex - 1)).ToString() + " jyid from Row order by jyid)order by jyid ");

                SqlParameter[] cmdParams = { };
                DataSet dsResult = SQLHelper.ExecuteDataset(GlobalData.DBConnStr, CommandType.Text, strSql.ToString(), cmdParams);
                foreach (DataRow dataRow in dsResult.Tables[0].Rows)
                {
                    rgzwlogs.Add(new TRgzwLogs(dataRow));
                }


            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }

            return rgzwlogs;
        }
        #endregion

2.多表聯合

舉例兩張表做測試:

表1:student  截圖如下:

  

表2:course  截圖如下:

一、外連接(左連接、右連接、完全外連接)

 

a.左連接  左表為主 行數為左表行數  left join 或者 left outer join

select * from student left join course on student.ID=course.ID

執行結果:

左外連接包含left join左表所有行,如果左表中某行在右表沒有匹配,則結果中對應行右表的部分全部為空(NULL).

注:此時我們不能說結果的行數等於左表數據的行數。當然此處查詢結果的行數等於左表數據的行數,因為左右兩表此時為一對一關系。

 

b.右連接 右表為主,行數為右表行數 right join 或 right outer join

select * from student right join course on student.ID=course.ID

執行結果:

 

右外連接包含right join右表所有行,如果左表中某行在右表沒有匹配,則結果中對應左表的部分全部為空(NULL)。

注:同樣此時我們不能說結果的行數等於右表的行數。當然此處查詢結果的行數等於左表數據的行數,因為左右兩表此時為一對一關系。

 

c.完全外連接 行數為左右表行數的集合 full join 或 full outer join

select * from student full join course on student.ID=course.ID

執行結果:

完全外連接包含full join左右兩表中所有的行,如果右表中某行在左表中沒有匹配,則結果中對應行右表的部分全部為空(NULL),如果左表中某行在右表中沒有匹配,則結果中對應行左表的部分全部為空(NULL)。

 

二、內連接

a.內連接  join 或 inner join

select * from student inner join course on student.ID=course.ID

 

執行結果:

inner join 是比較運算符,只返回符合條件的行。

此時相當於:

select * from student,course where student.ID=course.ID

 

三、交叉連接

a.交叉連接 cross join

1.概念:沒有 WHERE 子句的交叉聯接將產生連接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小。

select * from student cross join course

 

執行結果:

如果我們在此時給這條SQL加上WHERE子句的時候比如SQL:

select * from student cross join course where student.ID=course.ID

此時將返回符合條件的結果集,結果和inner join所示執行結果一樣。

 

四、兩表關系為一對多,多對一或多對多時的連接語句

當然上面兩表為一對一關系,那么如果表A和表B為一對多、多對一或多對多的時候,我們又該如何寫連接SQL語句呢?

其實兩表一對多的SQL語句和一對一的SQL語句的寫法都差不多,只是查詢的結果不一樣,當然兩表也要略有改動。

 

比如表1的列可以改為:

 

Sno Name Cno

 

表2的列可以改為:

 

Cno CName

這樣兩表就可以寫一對多和多對一的SQL語句了,寫法和上面的一對一SQL語句一樣。

 

下面介紹一下當兩表為多對多的時候我們該如何建表以及些SQL語句。

新建三表:

表A:  student 截圖如下:

表B:  course 截圖如下:

表C:  student_course 截圖如下:

一個學生可以選擇多門課程,一門課程可以被多個學生選擇,因此學生表student和課程表course之間是多對多的關系。

當兩表為多對多關系的時候,我們需要建立一個中間表student_course,中間表至少要有兩表的主鍵,當然還可以有別的內容。

select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

執行結果:

此條SQL執行的結果是學生選課的情況。

 

3.多表聯合+分頁

#region 獲取分頁內容
        /// <summary>
        /// 獲取分頁內容
        /// </summary>
        /// <param name="PageIndex"></param>
        /// <param name="PageSize"></param>
        /// <returns></returns>
        public static List<Tycoverlogs> GetPageContent(int PageIndex, int PageSize)
        { 
        
            List<Tycoverlogs> ycoverlogs=new List<Tycoverlogs>();
            try
            {
                StringBuilder strSql = new StringBuilder();
                string tabName, PKfld;
                tabName = "TYcOverLogs";
                PKfld = "OverTime";

                strSql.Append("with Row as ");//分頁
                strSql.Append(" ( ");
                strSql.Append(" select jyid=ROW_NUMBER() over(order by " + PKfld + " desc ),*from " + tabName);
                strSql.Append(" ) ");
                strSql.Append(" select top " + PageSize.ToString() + " * from Row ");
                strSql.Append(" left join TYcYt on Row.YcId=TYcYt.Id  ");//多表左連接
                strSql.Append(" where jyid not in (select top " + (PageSize * (PageIndex - 1)).ToString() + " jyid from Row order by jyid)order by jyid ");              
               
             
                SqlParameter[] cmdParams = { };
                DataSet dsResult = SQLHelper.ExecuteDataset(GlobalData.DBConnStr, CommandType.Text, strSql.ToString(), cmdParams);
                foreach (DataRow dataRow in dsResult.Tables[0].Rows)
                {
                    Tycoverlogs ycoverlogs1 = new Tycoverlogs(dataRow);
                    if (dataRow["Id1"] != DBNull.Value)
                    {
                        ycoverlogs1.YcYt = new TYcYt(dataRow);
                        ycoverlogs1.YcYt.Id = DataRowHelper.GetValue<int>(dataRow, "Id1");

                    }
                    ycoverlogs.Add(ycoverlogs1);                    
                }


            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }

            return ycoverlogs;
        }
        #endregion

 ---------------------------------------------------------------------------------------------------------姜彥 20170601


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM