【发布时间】:2015-06-28 05:30:17
【问题描述】:
我正在使用 SQL Server 12/Azure 并且有 3 个表(T1、T2、T3),其中 T1 有 1-many T2 和 T3,我想从 T2 中选择并返回 T1 记录的信息及其关联的 T3记录。 举个简单的例子,T1 是“客户”,T1 是“订单”,T3 是“客户地址”,所以一个客户可以有多个订单和多个地址。现在我想查询订单并包含客户信息和地址,让事情变得有点复杂,订单查询可能包括匹配客户地址,例如获取这些地址的订单。
Customer Table
----------------------
Id, Name,...
----------------------
Orders Table
------------------------------
OrderId, CustomerKey, Date,...
------------------------------
CustomerAddresses
-----------------------------------------------
AutoNumber, CustomerKey, Street, ZipCode,...
-----------------------------------------------
我无法编写最佳方式(优化)以在一个事务中返回所有结果并动态生成 sql 语句,这就是我认为结果应该返回的方式:
订单 (T2) 和客户信息 (T1) 在一个结果集/表中返回,而客户地址 (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 语句中包含我需要匹配的任何列。
- 有没有更好、更简单、更优化的方法来实现我想要的?
-------- 更新 --------------- 要详细说明我如何在我的应用中使用返回的数据:
我正在使用 ADO.NET、SqlConnection、SqlCommand 和 SqlDataReader 来解析结果。 (我不想在这里使用实体框架或任何其他高级数据库框架)
我的模型对象是 T2(订单)的集合,其中包含 T1(客户信息)和 T3(客户地址)
订单类: OrderId, OrderDate, CustomerId, CustomerName, CustomerAddresses[],...
CustomerAddresses 类: 街道,邮政编码,....
我发现人们通常在一个返回冗余数据的表中的单个选择语句中返回所有结果。我更喜欢按原样返回仅包含相关信息的表(T1、T2 和 T3),然后我可以在我的应用程序中对其进行处理以创建模型。
另一种解决方案是将 select 语句中的 ID 插入到 Temp 表中,然后在多个 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 如果有更好的方法可以向我解释作为一个很好的答案,基本上我将使用所有这些信息并将它们组合为多个结果 - 域对象 - 在我的应用程序。
-
当然@zaidsafadi,我的第一条评论是关于利用现有概念,即在模型层中使用工厂模式来构建业务实体,以供领域对象在技术堆栈中使用。为了提供更多细节,我需要更多地了解您的具体情况。例如,您使用的是 ADO.NET Entity Framework DBContexts 还是 ADO.NET SQLConnection 和相关对象?
-
@Geewers 请找到我的更新,我希望能更清楚地了解我想要完成的工作。谢谢!
-
在下面查看我的完整答案。万事如意
标签: sql-server ado.net relational-database azure-sql-database