2014-11-12 2 views
0

Я работаю в SQL Server 2008. Я знаю, что при объединении двух таблиц (называть их A и B), если я хочу вернуть все записи, которые находятся в A, но не находятся в B, я использую :Фильтрация с несколькими объединениями

SELECT 
columns 
FROM A 
LEFT JOIN B 
ON A.a_key = B.b_key 
WHERE B.b_key IS NULL 

В моей конкретной ситуации я пытаюсь присоединиться к 3 таблицам, где одна из них является промежуточной таблицей. Давайте назовем их A, B и C (B является промежуточным стол.) Вот важные столбцы:

A: colA1, colA2

B: colB1, colB2

C: colC1, colC2

B.ColB2 соответствует A.ColA1, а C.colC1 соответствует B.colB1. Моя цель состоит в том, чтобы вернуть все записи в том, что не в С. Итак, моя догадка прямо сейчас:

SELECT 
columns 
FROM A 
LEFT JOIN B 
ON A.colA1 = B.colB2 
LEFT JOIN C 
ON B.ColB1 = C.colC1 
WHERE C.colC1 IS NULL 

Я знаю, что есть некоторые записи в которые не в C. Однако, мой запрос не возвращает эти записи. Что я делаю не так? Мое лучшее предположение на данный момент состоит в том, что мои соединения ошибочны, так как B - промежуточная таблица.

ответ

1

Первый INNER JOIN в Table B и Table C. Затем сделайте LEFT JOIN результат с Table A, вы получите записи. Попробуй это.

SELECT * 
FROM a 
     LEFT JOIN (SELECT * 
        FROM b 
         JOIN c 
          ON b.colb1 = c.colc1) Scd 
       ON a.cola1 = scd.colb2 
WHERE scd.colb2 IS NULL 
+0

Это решение сработало для меня. Благодаря! – user3100444

+0

@ user3100444 - рад, что он помог ура :) –

0

На самом деле я никогда не видел такого синтаксиса, когда вы сравниваете ключи и добавляете условие, заставляющее ключ, с которым вы соединяетесь, иметь значение null. Также - левое соединение не только возвращает записи, которые не находятся в другой таблице, с которой вы соединяетесь, она просто не отбрасывает те, которые не соответствуют, и вместо этого заполняет остальную часть столбцов нулевыми значениями. Но он также ведет записи, которые совпадают в обеих таблицах. Вы можете пойти here для ясного примера.

Звучит не так, как левое соединение - это путь. Почему бы не делать регулярные соединения и использовать not it вроде этого:

select columns 
from A, B 
where A.colA1 = B.colB2 
and B.colB1 not in (select C.colC1 from C) 
Смежные вопросы