2009-07-11 73 views
1

當您在TSQL(MSSQL SERVER)中執行左連接時,如果右側有多行,是否可以保證哪個行將與您的查詢一起返回?TSQL左加入多個右手行

我想用它來利用正確的表上的順序。

所以

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 

我希望檢索所有可口可樂的表,所有的第一行中的一組可樂結果我LEFT JOIN根據我的排序。

這是由語言或服務器做出的任何保證嗎?

+1

請注意標籤自動提示提示。只有4個標有'mssql'的問題和超過6000個標記爲'sql-server'的問題。鑑於此,你認爲哪個是正確的?你來這裏已經夠久了,你應該知道更好。 – 2009-07-11 17:07:52

+0

我故意標記爲MSSQL服務器,因爲我的問題涉及到該服務器,因爲這可能會導致MSSQL服務器和Oracle訪問等不同。 – Spence 2009-07-11 17:10:17

+1

sql-server標記表示MS SQL Server。還有'oracle','mysql','ms-access'和其他數據庫風格的單獨標籤。再次檢查發佈問題時的提示。幾乎可以肯定_wrong_之後的任何小於10的標籤。 – 2009-07-11 17:12:28

回答

4

我相信你需要這個......

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 

的版本表相當常見的查詢,需要一個內部連接到最大查詢。

表名「表」沒有幫助,我把它重命名爲T.

2

不那麼簡單。 LEFT JOIN返回所有匹配的右側行。所以這裏關於擔保的問題並不真正相關。你必須用子查詢來做一些事情來獲得你需要的單行,在子查詢中使用TOP 1。

1

無論右側(連接鍵上)是否存在匹配的行,LEFT JOIN都將返回滿足任何WHERE條件的所有左側行。如果連接鍵上沒有匹配,則右表中的列將作爲NULL返回。