ОСТАВЛЕННОЕ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ (дает дополнительные строки), проблема

JSMin - другой.

10
задан Theofanis Pantelides 11 November 2009 в 09:04
поделиться

5 ответов

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

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

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

14
ответ дан 3 December 2019 в 14:53
поделиться

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

select DISTINCT * from @tb1 left outer join @tb2 ON c1 = c2
5
ответ дан 3 December 2019 в 14:53
поделиться

выбрать отдельный * из @ tb1 левое внешнее соединение @ tb2 ON c1 = c2

4
ответ дан 3 December 2019 в 14:53
поделиться

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

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
ответ дан 3 December 2019 в 14:53
поделиться

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

Чтобы получить желаемый эффект, вам нужно что-то вроде:

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

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

4
ответ дан 3 December 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: