Оригинальный подзапрос имеет большой недостаток: он предназначен для того, чтобы иметь возможность возвращать более одного значения, но это нарушит весь запрос.Измените ваши данные таким образом, чтобы любая группа была подключена к нескольким категориям, и она потерпит неудачу (например, (1, 'A1') -> (2, 'A1')
).DISTINCT
помогает избежать сбоев с данными примера, но не может помочь при различных значениях.
И вы не указали, какую категорию выбрать, если более одной соответствует группе.Я использовал MAX
:
SELECT
t.ID
,t.Grp
,c.Cat
FROM TBL1 t
INNER JOIN (
SELECT g.Grp, MAX(c.Cat) Cat
FROM TBL1 g
INNER JOIN TBL2 c
ON c.Code = g.ID
GROUP BY g.Grp
) c
ON c.Grp = t.Grp
WHERE NOT EXISTS(SELECT 1 FROM TBL2 t2 WHERE t2.Code = t.ID)
здесь TBL1
присоединяется к списку всех групп, связанных с любой категорией .INNER JOIN
сохранит только группы, которые связаны хотя бы с одной категорией (эквивалентно вашей NOT NULL
).И я заменил ваш LEFT JOIN
на NOT EXISTS
, потому что это более легкая операция для SQL SERVER, а результаты у него такие же.