Извините, но ваше мышление искажено.
Подумайте об этом так: если вам нужна только одна строка из tb2 для каждой строки в tb1, что что сервер должен выбирать? Дело в том, что из определения соединения, каждая строка в правой таблице, которая соответствует левой строке, является совпадением и должна быть включена.
You ' Я должен убедиться, что tbl2 имеет различные значения для c2 перед соединением. Предложение Мерфа могло бы помочь, если ваш вариант SQL поддерживает DISTINCT [столбец] (не все поддерживают).
Попробуйте использовать
select DISTINCT * from @tb1 left outer join @tb2 ON c1 = c2
выбрать отдельный * из @ tb1 левое внешнее соединение @ tb2 ON c1 = c2
Если вы хотите оставить только отдельные строки с левой стороны, вам нужно решить, что вы хотите показать справа, для каждого уникального значения слева. Если вы хотите, например, показать счетчик, вы можете сделать это:
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
Хм, запрос выполняет что он должен делать, поскольку в правой таблице есть повторяющиеся записи (или, по крайней мере, повторяющиеся идентификаторы).
Чтобы получить желаемый эффект, вам нужно что-то вроде:
SELECT * FROM @tb1 LEFT OUTER JOIN (SELECT DISTINCT c2 FROM @tb2) t2 ON @tb1.c1 = t2.c2
Если этого недостаточно, вам нужно объяснить требование более подробно.