2012-06-15 2 views
0

Мне нужна помощь в том, как написать запрос SQL Server 2005 для обработки объединения нескольких подтасов. Вот мой сценарий:Как структурировать запрос tsql для обработки нескольких subtables

Таблицы:

Клиенты

  • Customer_PK

Заказы

  • Order_PK
  • OrdersTypeA_FK
  • OrdersTypeB_FK
  • OrdersTypeC_FK
  • Customer_FK

OrdersTypeA

  • OrdersTypeA_PK
  • Shipper_FK

OrdersTypeB

  • OrdersTypeB_PK
  • Shipper_FK

OrdersTypeC

  • OrdersTypeC_PK
  • Shipper_FK

грузоотправители

  • Shipper_PK
  • ShipperAddress_FK

ShipperAddress

  • ShipperAddress_PK
  • ShipperState

В таблице Заказы есть данные, выглядит следующим образом:

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 извлекала ShipperAddress, находя Shipped_FK из одной из трех таблиц 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 

У меня нет отдельного соединения с ShipperAddress для каждой из таблиц OrdersType. Это меньшая выборка проблемы, которая имеет гораздо больше таблиц на уровне OrdersType. Shipper_FK является одинаковым в каждой из таблиц OrdersType. Мне нужно получить в Shipper_FK вне зависимости от того, из какой таблицы OrdersType он пришел, чтобы продолжить с заявлением о соединении. Как это можно сделать?

+0

Почему у вас есть три колонки типа заказа (и затем три различные таблицы, чтобы идти вместе с ними)? Что в этих типах заказов так отличается от них, что их нужно отдельно моделировать? –

+0

Это всего лишь пример структуры таблиц, с которыми я имею дело. В этом примере рассмотрим OrderType_A как Тип рассылки, OrderType_B как тип Интернета и OrderType_C как Тип телефона. Структура таблицы задана и не может быть изменена. Проблема здесь заключается в том, чтобы выяснить, как написать запрос. – user31673

ответ

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; 
Смежные вопросы