0

複数のサブテーブルの結合を処理するために SQL Server 2005 クエリを作成する方法について助けが必要です。これが私のシナリオです:

テーブル:

お客様

  • 顧客_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

荷送人

  • 荷送人_PK
  • 荷送人住所_FK

荷送人住所

  • 荷送人住所_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

私の問題は、3 つの OrdersType テーブルのいずれかから Shipper_FK を見つけて、select join ステートメントで ShipperAddress を取得する必要があることです。Orders テーブルには、行ごとに OrdersType FK が 1 つだけ含まれます。OrdersType テーブルから取得する必要があるのは、ShipperAddress テーブルに結合できるように Shipper_FK だけです。

それで、結合はどのように見えますか???

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 に到達する必要があります。どうすればそれができますか?

4

1 に答える 1

1

これは、読んで、最適化し、維持するのが楽しくなるでしょう...

SELECT sa.ShipperState  --, other columns surely
FROM dbo.Customers AS c
LEFT OUTER JOIN dbo.Orders AS o 
ON o.Customer_FK = c.Customer_PK
LEFT OUTER JOIN dbo.OrdersTypeA AS oa
  ON oa.OrdersTypeA_PK = o.OrdersTypeA_FK
LEFT OUTER JOIN dbo.OrdersTypeB AS ob
  ON ob.OrdersTypeB_PK = o.OrdersTypeB_FK
LEFT OUTER JOIN dbo.OrdersTypeC AS oc
  ON oc.OrdersTypeC_PK = o.OrdersTypeC_FK
LEFT OUTER JOIN dbo.Shippers AS s
  ON s.Shipper_PK = COALESCE(oa.Shipper_FK, ob.Shipper_FK, oc.Shipper_FK)
LEFT OUTER JOIN dbo.ShipperAddress AS sa
  ON s.ShipperAddress_FK = sa.ShipperAddress_PK;
于 2012-06-15T02:53:24.097 に答える