我正在使用SQL Server 12/Azure並有3個表(T1,T2,T3),其中T1與T2和T3有一對多,I想要從T2中選擇並返回T1記錄的信息及其相關的T3記錄。 舉一個簡單的例子,T1是「客戶」,T1是「訂單」,T3是「CustomerAddresses」,所以客戶可以有很多訂單和多個地址。現在,我想要查詢訂單幷包括顧客信息和地址,以使事情變得有點複雜,對訂單的查詢可以包括對顧客地址的匹配,例如,獲取這些地址的訂單。SQL Server - 從子 - 父 - 子選擇並返回多個結果集
Customer Table
----------------------
Id, Name,...
----------------------
Orders Table
------------------------------
OrderId, CustomerKey, Date,...
------------------------------
CustomerAddresses
-----------------------------------------------
AutoNumber, CustomerKey, Street, ZipCode,...
-----------------------------------------------
我無法寫回在一個事務中所有的結果和動態生成SQL語句的最佳途徑(優化),這是我想結果應該回來:
訂單( T2)和客戶信息(T1)在一個結果集/表中返回,CustomerAddresses(T2)在另一個結果集/表中返回。我正在使用ADO.NET生成並執行查詢並使用System.Data.SqlClient.SqlDataReader來循環返回的結果。結果怎麼可能回來
例子:
Order-Customer Table
-------------------------------
Order.OrderId, Customer.Id, Customer.Name, Order.Date,....
-------------------------------
CustomerAddresses
-------------------------------
AutoNumber, CustomerKey, Street
-------------------------------
這是一個查詢的例子,我目前正在產生:
SELECT [Order].[OrderId], [Order].[Date], [Customer].[Id], [Customer].[Name]
FROM Order
INNER JOIN [Customer] on [Order].[CustomerKey] = [Customer].[Id]
WHERE ([Order].[Date] > '2015-06-28')
問題: 1.如何延長上述查詢還允許將CustomerAddresses返回到單獨的結果集/表中? 要在CustomerAddresses上啓用匹配,我應該能夠與Customer表進行連接,並在WHERE語句中包含任何需要匹配的列。
- 有沒有更好,更簡單,更優化的方法來實現我想要的?
-------- UPDATE --------------- 爲了澄清更多關於我如何在我的應用程序使用返回的數據:
我使用ADO.NET,SqlConnection,SqlCommand和SqlDataReader來解析結果。 (我不希望使用實體框架或任何其他高級DB這裏框架)
我的模型對象是T2(訂單)的集合,其中包含T1(客戶信息)和T3(CustomerAddresses)
OrderClass: 的OrderId,訂購日期,客戶ID,客戶名稱,CustomerAddresses [],...
CustomerAddresses類: 街,郵編,....
我發現人們通常會在一個表中返回一個冗餘數據的單個select語句中返回所有結果。我更喜歡的是返回僅包含相關信息的表格(T1,T2和T3),然後我可以在我的應用程序中處理它以創建模型。
另一種解決方案是從select語句的ID插入到一個臨時表,然後返回多個SELECT語句的結果:
Select T1.* From T1 where Id in (
select Temp.T1Id from Temp)
Select T2.* From T2 where Id in (
select Temp.T2Id from Temp)
Select T3.* From T3 where Id in (
select Temp.T3Id from Temp)
我不是100%確定爲什麼你希望在單個事務中分離出2個從數據庫返回的相關結果集?我只能想象你的意圖是在以後重新使用所有的客戶地址?但是,根據您的需求獲取已經過濾的單個結果集可能會更高效,然後在運行時從邏輯上將該集分離爲您所需的實體模型。 – Geewers
@Geewers如果有更好的方式,你可以向我解釋一個很好的答案,基本上我將使用所有這些信息,並將它們作爲多個結果 - 構造對象 - 在我的應用程序中。 –
Sure @zaidsafadi,我的第一個評論是關於利用現有的概念,即使用模型層中的工廠模式來構建業務實體,以供技術堆棧上方的域對象使用。爲了提供更多細節,我需要更多地瞭解您的具體情況。例如,您是使用ADO.NET實體框架DBContexts還是ADO.NET SQLConnection和相關對象? – Geewers