TSQL Left Join с несколькими правыми рядами - PullRequest
1 голос
/ 11 июля 2009

Когда вы выполняете левое объединение в TSQL (MSSQL SERVER), есть ли гарантия, какая строка вернется с вашим запросом, если справа несколько строк?

Я пытаюсь использовать это, чтобы использовать порядок на правильном столе.

так

Select ColA, ColB, ColC 
from T
Left Outer Join 
   (Select ColA, ColB, ColC 
   from T--CLARIFIED, this is a self join.
   Order by TopColumn Desc) AS OrderedT(ColA, ColB, ColC) 
   On T.ColA = OrderedT.ColA

Я ожидаю получить все ColA в таблице и все первые строки в наборе результатов ColA для моего левого соединения на основе моего заказа.

Есть ли какие-либо гарантии, сделанные на это языком или сервером?

Ответы [ 3 ]

4 голосов
/ 11 июля 2009

Полагаю, вам это нужно ...

select T.ColA, T.ColB, T.ColC 
from T
inner join
   (select ColA, max(TopColumn) MaxTopColumn
   from T
   group by ColA) OrderedTable
   on T.ColA = OrderedTable.ColA and T.TopColumn = OrderedTable.MaxTopColumn

Довольно распространенный запрос для версионных таблиц, требуется внутреннее соединение с запросом max.

Название таблицы «Таблица» не помогает, я переименовал ее в T.

2 голосов
/ 11 июля 2009

Не все так просто. LEFT JOIN возвращает все соответствующие правые строки. Так что вопрос о гарантии здесь не очень актуален. Вам нужно что-то сделать с подзапросом, чтобы получить нужную строку, используя TOP 1 в подзапросе.

1 голос
/ 11 июля 2009

LEFT JOIN возвращает все левые строки, удовлетворяющие любым критериям WHERE, независимо от того, есть ли соответствующая строка справа (на ключе (ах) соединения). Столбцы в правой таблице будут возвращены как ПУСТО (NULL), если для ключа соединения нет совпадений.

...