ЛЕВАЯ ВНЕШНЕЕ СОЕДИНЕНИЕ (дает дополнительные строки) проблема - PullRequest
10 голосов
/ 11 ноября 2009

У меня есть две таблицы, которые я хочу объединить, используя левое внешнее соединение. Однако, хотя моя левая таблица содержит только уникальные значения, правая таблица удовлетворяет условию более одного раза и, как таковая, добавляет дополнительные строки в набор результатов.

Код для решения проблемы:

declare @tb1 table (c1 int)
declare @tb2 table (c2 int)

INSERT INTO @tb1 VALUES (1)
INSERT INTO @tb1 VALUES (2)
INSERT INTO @tb1 VALUES (3)
INSERT INTO @tb1 VALUES (4)

INSERT INTO @tb2 VALUES (3)
INSERT INTO @tb2 VALUES (4)
INSERT INTO @tb2 VALUES (5)
INSERT INTO @tb2 VALUES (6)

select * from @tb1 left outer join @tb2 ON c1 = c2

INSERT INTO @tb2 VALUES (3)
INSERT INTO @tb2 VALUES (4)
INSERT INTO @tb2 VALUES (5)
INSERT INTO @tb2 VALUES (6)

select * from @tb1 left outer join @tb2 ON c1 = c2

Как видите, первый SELECT возвращает 4 строки, где второй SELECT 6, хотя левая таблица остается неизменной.

Как строго придерживаться левой таблицы и использовать только правую таблицу, чтобы ДОПОЛНИТЬ строки из левой таблицы?

HELP!

RESULTS:
c1          c2
----------- -----------
1           NULL
2           NULL
3           3
4           4

[DUPLICATE @tb2 records]

c1          c2
----------- -----------
1           NULL
2           NULL
3           3
3           3
4           4
4           4

Ответы [ 5 ]

14 голосов
/ 11 ноября 2009

Извините, но ваше мышление искажено.

Подумайте об этом так: если вам нужна только одна строка из tb2 для каждой строки в tb1, какой сервер выбрать? Дело в том, что из определения объединения каждая строка в правой таблице, которая совпадает с левой строкой, является совпадением и должна быть включена.

Вы должны убедиться, что tbl2 имеет различные значения для c2 до объединения. Предложение Мерфа может сделать это, если ваш вариант SQL поддерживает DISTINCT [колонка] (не все это делают).

5 голосов
/ 11 ноября 2009

Попробуйте использовать

select DISTINCT * from @tb1 left outer join @tb2 ON c1 = c2
4 голосов
/ 11 ноября 2009

Хм, запрос делает то, что должен, поскольку в правой таблице есть повторяющиеся записи (или, по крайней мере, повторяющиеся идентификаторы).

Чтобы получить эффект, вы хотите что-то вроде:

SELECT * FROM @tb1 LEFT OUTER JOIN (SELECT DISTINCT c2 FROM @tb2) t2 ON @tb1.c1 = t2.c2

Если этого недостаточно, вам нужно объяснить это требование более подробно.

4 голосов
/ 11 ноября 2009

Если вы хотите сохранить только одну строку слева, вам нужно решить, что вы хотите показать справа, для каждого уникального значения слева. Если вы хотите показать счет, например, вы можете сделать это:

select b1.c1, x.c from @tb1 b1 
left outer join 
(
  select c2, count(*) as c 
  from @tb2
  group by c2
) as x 
ON b1.c1 = x.c2

или если вы просто хотите получить один случай значений из c2:

select b1.c1, x.c2 from @tb1 b1 
left outer join 
(
  select c2
  from @tb2
  group by c2
) as x 
ON b1.c1 = x.c2
4 голосов
/ 11 ноября 2009

выбрать отличительные * из @ tb1 левого внешнего соединения @ tb2 ВКЛ c1 = c2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...