2015-04-29 7 views
0

У меня есть 3 таблицы:SQL Server Условный Объединить две таблицы

TableA(IDRem, IDPed, IDOP) 
TableB(IDOP, IDPed) 
TableC(IDPed, InvoiceDate) 

Мне нужно выбрать, чтобы присоединиться к записи TableA и TableC, но есть два возможных условия:

  • IF IDPed на TableA IS NOT NULL, затем присоединяется непосредственно к TableC по IDPed
  • ID IDPed на TableA IS NULL, затем присоединяется к TableB по IDOp, а затем присоединяется к TableB to TableC по IDPed

До сих пор я стараюсь это:

SELECT 
    TableA.* 
    ,(CASE WHEN TableC.InvoiceDate IS NULL 
     THEN TableC2.InvoiceDate 
     ELSE TableC.InvoiceDate 
    END) AS InvoiceDate 
FROM 
    TableA 
    LEFT JOIN TableC on TableA.IDPed = TableC.IDPed 
    LEFT JOIN TableB on TableB.IDOp = TableA.IDOp 
    INNER JOIN TableC as TableC2 on TableC2.IDPed = TableB.IDPed 

Проблема с этим состоит в том, что каждое поле о TABLEA Я хочу, чтобы включить в выбор мне нужно сделать дело ... когда, чтобы определить, происхождение - tableA или TableA2.

Есть ли лучший способ сделать это? Благодаря!

ответ

1

Для комплекса присоединяется к вам лучше обслуживаются в TSQL с использованием креста применяются:

When should I use Cross Apply over Inner Join?

select IDRem, IDPed, IDOP from TableA a 
cross apply(
    select IDOP, IDPed from TableB binner 
    where a.IDop = binner.IDop 
) b 
cross apply(
    select IDPed, InvoiceDate cinner 
    where b.IDPed = cinner.IDPed 
) c 
where ... 

Строго псевдо-код, но должен дать вам начать.

+0

mmmm i never use Cross Apply before, можете ли вы дать базовый образец о том, как его использовать в этом случае? благодаря! – ericpap

+0

Я добавил быстрый пример (отказ от ответственности, который я не проверял, так что это может быть не идеально). – garryp

+0

Посмотрите на эту статью: http://sqlserverplanet.com/sql-2005/cross-apply-explained – garryp

1

Вы могли бы попытаться сделать оба JOIN с и использовать UNION ALL

Edit: Как было отмечено в комментарии Владимира Баранова, нет никакой необходимости, чтобы проверить, если a.IdPed IS NULL на первом SELECT, так как если она, JOIN бы не возвращать строки.

SELECT 
    a.*, 
    c.InvoiceDate 
FROM TableA a 
INNER JOIN TableC c ON c.IdPed = a.IdPed 

UNION ALL 

SELECT 
    a.*, 
    c.InvoiceDate 
FROM TableA a 
INNER JOIN TableB b ON b.IdOp = a.IdOP 
INNER JOIN TableC c ON c.IdPed = b.IdPed 
WHERE a.IdPed IS NULL 
+1

Добавьте к вашему объяснению ответ, что в первом 'SELECT' нет необходимости проверка 'WHERE a.IdPed NOT NOT": когда 'IDPed' является NULL,' JOIN' не будет возвращать строки, поэтому нет необходимости явно проверять его здесь. Во втором «SELECT» проверка необходима. –

+0

Вы правы. Я отредактирую свой ответ. –

+0

Спасибо, но это кажется еще более сложным, что мой текущий attemp, соединяющий дважды tableC. Я ищу простой ответ. – ericpap

Смежные вопросы