【发布时间】:2012-06-15 02:31:51
【问题描述】:
我需要有关如何编写 SQL Server 2005 查询来处理连接多个子表的帮助。这是我的场景:
表格:
客户
- Customer_PK
订单
- Order_PK
- OrdersTypeA_FK
- OrdersTypeB_FK
- OrdersTypeC_FK
- Customer_FK
订单类型A
- OrdersTypeA_PK
- Shipper_FK
订单类型B
- OrdersTypeB_PK
- Shipper_FK
订单类型C
- OrdersTypeC_PK
- Shipper_FK
托运人
- Shipper_PK
- ShipperAddress_FK
发件人地址
- ShipperAddress_PK
- 托运国
Orders 表的数据如下所示:
Order_PK OrdersTypeA_FK OrdersTypeB_FK OrdersTypeC_FK Customer_FK
-------- -------------- -------------- -------------- -----------
1 1 null null 1
2 null 1 null 2
3 null null 1 3
我的问题是我需要让 select join 语句通过从三个 OrdersType 表之一中查找 Shipper_FK 来检索 ShipperAddress。 Orders 表每行只有一个 OrdersType FK。我需要从 OrdersType 表中检索的唯一内容是 Shipper_FK,以便我可以加入 ShipperAddress 表。
那么连接看起来怎么样???
select
ShipperAddress.ShipperState
from Customers
left join Orders on Orders.Customer_FK = Customers.Customer_PK
????????
left join Shippers on Shipper_PK = ??????.Shipper_FK
left join ShipperAddress on ShipperAddress.ShipperAddress_PK = Shippers.ShipperAddress_FK
我不能为每个 OrdersType 表单独连接到 ShipperAddress。这是一个较小的问题示例,在 OrdersType 级别有更多表。 Shipper_FK 在每个 OrdersType 表中都是相同的。无论它来自哪个 OrdersType 表,我都需要访问 Shipper_FK 以继续执行 join 语句。怎么可能?
【问题讨论】:
-
为什么你有三个不同的订单类型列(然后是三个不同的表格)?这些订单类型有何不同之处需要单独建模?
-
这只是我正在处理的表结构的一个示例。对于此示例,将 OrderType_A 视为邮件类型,将 OrderType_B 视为 Internet 类型,将 OrderType_C 视为电话类型。表结构已设置且无法更改。这里的问题是弄清楚如何编写查询。
标签: sql sql-server tsql sql-server-2005