三種方法實現從“一個(組)查詢過程中返回兩個表的查詢結果”,三種方法查詢結果

來源:互聯網
上載者:User

三種方法實現從“一個(組)查詢過程中返回兩個表的查詢結果”,三種方法查詢結果

            還記得開始做機房的時候,遇到了要從一個函數中返回兩個表的查詢結果。當時的解決方案很“衝動”也很“無拘無束”,直接在實體類裡邊添加了其他表的實體,效果是達到了,但總覺得不倫不類。

            現在介紹三種解決上述問題的方法(代碼為VB.net,系統使用三層架構)。

            題設要求:假設我現在要從卡表和學生表裡返回查詢資訊(卡表的comment,money,status和學生表的全部資訊),卡表和學生表如下:

           

                                                  圖一  學生表

                

                                                  圖二    卡表

           

方法一:視圖。

            比較簡單,相信這種方法是最常用的了。

            

<span style="font-size:18px;">create view V_ CardStudent @CardNo varchar(100)asselect comment,money,status,studentNo,cardNo,studentName,sex,department,grade,stclassfrom T_Card,T_Studentwhere T_Card.userName=T_Student.userName select * from V_ CardStudentwhere cardNo=@CardNo</span>



            視圖的應用也要求有外部索引鍵關聯,尤其是當我們做增刪改等操作時,這樣能保證資料的一致性,避免產生髒資料。同時,這裡要建立新的包含所有要返回資訊的實體集。         

  方法二:sql聯集查詢。

            這種方法要求表之間有外部索引鍵關聯,我的學生表的userName是主鍵,也是卡表的外鍵。另外,我們也需要重建一個實體集,要包含所有要求返回的資訊。    

           

<span style="font-size:18px;">聯集查詢sql子句:strSql = "Select c.comment,c.money,c.status From T_Card as c inner join  T_Student as s on c.userName=s.userName Where (c.cardNo=@CardNo)"</span>


            適用情況:如果是需要操作的表比較少,如兩三個可以考慮用這種方法,但如果是要求一次返回六七個表的資訊,就不太推薦了,那樣的sql語句著實是一個大難題……不僅不能

重用,花費的時間還不如多寫幾行代碼。

 

            方法三:泛型集合的“集合”。

            這種方法不需要什麼主外鍵、也不用建立實體集,原理簡單,但需要用到泛型集合。

            原理:我們先尋找每個表的實體資訊,返回一個List集合,然後把我們所需要的集合結果都添加到一個新的List中,如下(部分代碼):

            

<span style="font-size:18px;">Dim myCardList As List(Of CardEntity)        Dim myStudentList As List(Of StudentEntity)         '尋找卡表中的資訊,放到myCardList中        strQueryCardInfo = "Select * From T_Card Where cardNo=@CardNo"        Dim paraCard As SqlParameter() = {New SqlParameter("@CardNo", enCard.cardNo)}        dtQueryCardInfo = sqlHelper.ExecuteSelect(strQueryCardInfo, CommandType.Text, paraCard)        myCardList = CType(listHelper.convertToList(Of CardEntity)(dtQueryCardInfo), Global.System.Collections.Generic.List(Of Global.Entity.CardEntity))        '尋找學生表中的資訊,放到myStudentList中        strQueryStudentInfo = "Select * From T_Student Where cardNo=@CardNo"        Dim paraStudent As SqlParameter() = {New SqlParameter("@CardNo", enStudent.cardNo)}        dtQueryStudentInfo = sqlHelper.ExecuteSelect(strQueryStudentInfo, CommandType.Text, paraStudent)        myStudentList = CType(listHelper.convertToList(Of StudentEntity)(dtQueryCardInfo), Global.System.Collections.Generic.List(Of Global.Entity.StudentEntity))        Dim myList As New List(Of Object)  '建立一個新List        myList.Add(myCardList)  '添加myCardList        myList.Add(myStudentList)  '添加myStudentList        Return myList</span>



            這種方法的缺點就是代碼量較大,也不易維護。


            總結:無論哪種方法,都是需要謹慎考慮去選擇的,有的需要時間代價,有的需要空間代價、維護代價等。所以,當我們學會或瞭解了新的技術或方法時,一定要謹慎分析其使用範圍和優缺點,選擇相對合適的方法,這樣我們的程式才能更穩健、高效。


sql中引用一個表的查詢結果作為條件來查詢另一個表怎實現?

exists 這個裡面得要包含和外面表的關係的。

select 消費號,sum(金額)金額 from 護理卡消費 T
where exists (
select distinct a.消費號 from 護理卡消費曆史 a left join 護理卡消費 d on a.消費號=d.消費號
where a.服務名稱 in (select b.服務名稱 from 服務類別 b where b.服務項目類別='面部護理')
and t.消費號=a.消費號 )
group by 金額,消費號

你這樣試試
 
sql2008怎返回兩個無關聯表的查詢結果?

select a.列 as cola,'' as colb from a where 條件
union all
select '' as cola ,b.列 as colb from b where 條件
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.