SQL запрос с левым соединением для возврата результатов, когда верхний 1 столбец объединенной таблицы совпадает со столбцом основной таблицы - PullRequest
1 голос
/ 11 февраля 2020

У меня есть основная таблица (TableA), и я оставляю присоединение к TableB, но я хочу включить только первую запись в TableB, в которой совпадают значения ColumnB двух таблиц. Я получил это, чтобы работать в запросе ниже, за исключением того, что мне также нужно включить записи TableA, где не существует соответствующей записи для TableB (то есть в запросе ниже b.ColumnA будет нулевым). Я понимаю, почему моя строка ниже «ИЛИ b.ColumnA = null» не работает, но я изо всех сил пытаюсь найти решение, которое делает. в таблице B

SELECT b.ColumnA, a.ColumnA, a.ColumnB
FROM TableA a
LEFT JOIN TableB b ON b.ColumnB = a.ColumnB
WHERE b.ColumnA = (SELECT TOP 1 bb.ColumnA FROM TableA aa LEFT JOIN TableB bb ON bb.ColumnB = a.ColumnB)
OR b.ColumnA = null

1 Ответ

3 голосов
/ 11 февраля 2020

Использование OUTER APPLY:

SELECT b.ColumnA, a.ColumnA, a.ColumnB
FROM TableA a OUTER APPLY
     (SELECT TOP (1) b.*
      FROM TableB b 
      WHERE b.ColumnB = a.ColumnB
      ORDER BY ?  -- however you are defining the ordering for "first"
     ) b;

Вы можете не указывать ORDER BY, если вы довольны произвольной соответствующей записью из b. Тем не менее, вопрос указывает «сначала», не определяя его.

...