2010-12-06 6 views
1

Я столкнулся с проблемой соединения в базе данных sql server 2005. Я следующую структуру: таблицыSQL Server: как сделать запрос с левым внешним соединением + зависимым внутренним соединением?

TableA --LEFT JOIN--> TableB --INNER JOIN-->TableC 

Так что, если я пишу запрос, как это:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN TableB ON TableA.keyOfB = TableB.key 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
where TableA.key = aValue 

он прочитал 0 запись, если есть не какой-либо TableB запись, связанная с TableA записи. Но TableB находится во внешнем соединении, так что это не то, что я ожидал. Другими словами, INNER JOIN не должен был считаться, потому что нет ни одной записи TableB! Что мне не хватает?

ответ

1

Я думаю, что он должен делать с порядком РЕГИСТРИРУЙТЕСЬ операций.

Результат (A LEFT OUTER JOIN B) INNER JOIN C, вы хотите ВНЕШНИЙ ВНЕШНИЙ (B INNER JOIN C).

Попробуйте сбросить некоторые().

Или попробуйте переназначение вашего JOINS к ... B ВНУТРЕННЕМУ C RIGHT OUTER А получить (B ВНУТРЕННИЙ C) RIGHT OUTER А.

EDIT: примера того, что я думал:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN (TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) 
ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 

Подавать к RIGHT OUTER:

SELECT TableA.* FROM TableB 
INNER JOIN TableC ON TableB.keyOfC = TableC.key 
RIGHT OUTER JOIN TableA ON TableA.keyOfB = TableB.key 
WHERE TableA.key = aValue 

Примечание: Простите меня, если это не работает, я не касался SqlServer начиная с версии 7.

1

Используйте виртуальную таблицу для соединения (B + C).
EDIT: Что-то вроде:

SELECT TableA.* FROM TableA 
LEFT OUTER JOIN 
    (select key from TableB INNER JOIN TableC ON TableB.keyOfC = TableC.key) as TableBC 
    ON TableA.keyOfB = TableBC.key 
where TableA.key = aValue 
+0

Можете ли вы изменить код Пьер Луиджи с вашим предложением, потому что я не уверен, что вы имеете в виду здесь? – David 2010-12-06 11:34:19

1

Это ведет себя точно так, как это должно быть. Ваша связь с TableC осуществляется через TableB, поэтому ссылка не будет подключена, если нет записи TableB.

Изменение INNER JOIN до LEFT OUTER также, хотя оно действительно является внутренним, насколько это касается данных.

1

Если вы запустите запрос без INNER JOIN, будут ли все записи с TableB.key null, не так ли? Поэтому следующий INNER JOIN не может найти подходящую запись, поэтому результата нет.

0

Вот пример использования левого соединения для обеих таблиц b и c.

declare @TableA table (Adata1 char(2), Adata2 char(2)) 
declare @TableB table (Bdata1 char(2), Bdata2 char(2)) 
declare @TableC table (Cdata1 char(2), Cdata2 char(2)) 

;Insert @TableA 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableB 
Select 'Ab', 'Ab' union all 
Select 'B', 'B' union all 
Select 'C', 'C' 

;Insert @TableC 
Select 'A', 'A' union all 
Select 'B', 'B' union all 
Select 'Cb', 'Cb' 

--Select * From @TableA 
--Select * From @TableB 
--Select * From @TableC 

Select * from @TableA 
LEFT OUTER JOIN @TableB on Adata1 = Bdata1 
LEFT OUTER JOIN @TableC on Bdata1 = Cdata1 

Результаты:

Adata1 Adata2 Bdata1 Bdata2 Cdata1 Cdata2 
A   A NULL NULL NULL NULL 
B   B B B B B 
C   C C Cb NULL NULL 
Смежные вопросы