Формулировка TSQL Left Join - PullRequest
0 голосов
/ 07 октября 2011

Я использую SSMS 2008. Должно быть простое решение для этого. Я пытаюсь извлечь все записи из таблицы A, но извлекает только совпадающие записи из таблиц B и C. Проблема состоит в том, что, если я оставляю таблицы B и C соединения, он возвращает записи, где все 3 из этих таблиц пересекаются. Например, если я сделаю запрос об этом объединенном слиянии, я получу ненулевые значения для каждой строки как для B, так и для C.

Вот мой псевдокод:

SELECT A.ID, B.ID, C.ID
FROM A
LEFT JOIN B ON B.ID = A.ID
LEFT JOIN C ON C.ID = A.ID

Отвечая на ваши вопросы, я сожалею, что забыл «ВЛЕВО», но я только что добавил его выше. Если таблица A имеет 9 строк, а B имеет 2 строки, а C имеет 3 строки, то, что я хочу видеть выше, это где таблица A пересекается с B и где A пересекается с C. Таким образом, в только что описанном сценарии, предполагая, что все строки таблицы B отличаются от строк таблицы C, я хочу увидеть всего 5 строк; 2 из B и 3 из C. Имеет смысл?

Ответы [ 4 ]

1 голос
/ 07 октября 2011

То, что вы хотите, это присоединение к профсоюзному заговору.

SELECT A.ID, 
case when D.tablename = 'B' then  ID else null end, 
case when D.tablename = 'C' then  ID else null end
FROM A 
JOIN 
(select Id, 'b' as tablename from B
union all
select id, 'c' from c)
D ON D.ID = A.ID 
1 голос
/ 07 октября 2011

Постановка проблемы по-прежнему противоречива. Я думаю, вы имеете в виду, где таблица A пересекается с B ИЛИ, где A пересекается с C. В этом случае правильный TSQL:

    SELECT A.ID
    FROM A
    LEFT OUTER JOIN B ON B.ID = A.ID
    LEFT OUTER JOIN C ON C.ID = A.ID
    WHERE B.ID IS NOT NULL OR C.ID IS NOT NULL 
    GROUP BY A.ID 
    ORDER BY A.ID

Нет необходимости сообщать B.ID и C.ID, если они равны A.ID. Группировка By означает, что вы не получаете повторение A.ID.

1 голос
/ 07 октября 2011

Идеальный способ сделать это с LEFT JOIN. Я считаю (хотя из вашего вопроса неясно), что у вас проблема в нескольких строках на A.ID.

Если A.ID соответствует B.ID И C.ID, то вы получаете две строки для этого и хотите одну консолидированную строку.

Я думаю, что, возможно, в вашем тестовом запросе смешались ваши условия JOIN. Это работает нормально для меня в тестировании. Попробуйте следующий запрос:

DECLARE @A TABLE (ID INT)
DECLARE @B TABLE (ID INT)
DECLARE @C TABLE (ID INT)

INSERT INTO @A VALUES
(1),
(2),
(3),
(4)

INSERT INTO @B VALUES
(2),
(3)

INSERT INTO @C VALUES
(3),
(4)

SELECT A.ID, B.ID, C.ID
FROM @A A
LEFT JOIN @B B
    ON B.ID = A.ID
LEFT JOIN @C C
    ON C.ID = A.ID

Вывод:

ID  ID      ID
1   NULL    NULL
2   2       NULL
3   3       3
4   NULL    4
0 голосов
/ 07 октября 2011
SELECT A.ID, B.ID, C.ID
FROM A
LEFT JOIN B ON B.ID = A.ID
LEFT JOIN C ON C.ID = A.ID
WHERE B.ID IS NOT NULL OR C.ID IS NOT NULL

Или, если вам нужны только поля из A, тогда

SELECT A.ID
FROM A
INNER JOIN (
    SELECT B.ID FROM B
    UNION
    SELECT C.ID FROM C ) AS U ON U.ID = A.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...