我該怎麼辦內部聯接,並從具有相同的列行只選擇一排?如何接收特定行的內連接SQL
例如:
如果我執行查詢:
SELECT t1.col1, t2.col3
FROM t1 INNER JOIN t2
ON t1.col2=t2.col2;
我會得到表
不過,我想只得到一個行(最上面的一個),每個值在COL1
任何想法?
謝謝!
我該怎麼辦內部聯接,並從具有相同的列行只選擇一排?如何接收特定行的內連接SQL
例如:
如果我執行查詢:
SELECT t1.col1, t2.col3
FROM t1 INNER JOIN t2
ON t1.col2=t2.col2;
我會得到表
不過,我想只得到一個行(最上面的一個),每個值在COL1
任何想法?
謝謝!
您可以使用查詢類似如下:
SELECT t1.col1, t2.col3
FROM t1
INNER JOIN (
SELECT col2, MIN(col3) AS col3
FROM t2
GROUP BY col2
) AS t2 ON t1.col2=t2.col2;
沒有。這將給出col3的最小值不是第一個值 –
@ChaosLegion沒有* first value *這樣的東西。 SQL表是*無序集*,優先級由特定列管理。從OP中提供的上下文中,我假定這種情況下的字段是'col3'。 –
是的。他的要求是首位。你的答案難以改變嗎? –
你可能想嘗試的窗口函數與OUTER
SELECT T.col1, T.col3
FROM (
SELECT t1.col1, t2.col3 ,
ROW_NUMBER() over (partition by t1.col1 order by t2.col3) as orden
FROM t1 INNER JOIN t2
ON t1.col2=t2.col2) as T
WHERE T.orden = 1;
謝謝,一個好主意! –
另一種方式適用於:
SELECT t1.col1,p.col3
FROM t1
OUTER APPLY (
SELECT TOP 1 *
FROM t2
WHERE t1.col2 = t2.col2) as p
輸出:
col1 col3
1 10
2 30
謝謝!我不知道「外部適用」。 –
偉大的,如果你發現新的東西!更多的技術細節和例子,你可以從這裏獲得https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/ – gofr1
You can also use below
Select Col1,Col3 From (
SELECT Col1,Col3,DENSE_RANK() OVER (PARTITION BY t2.Col2 ORDER BY Col3) rank
FROM T2 JOIN T1 on T2.col2=T1.col2) Tr where rank=1
所有的答案是正確的..但有些會帶來不同的甚至是最壞的,不可預測的輸出(非確定性)。
在解決方案1)group by /分鐘來自@ AllanS.Hansen和@GiorgosBetsos,您將在t1中獲得每行t2的一行t2。 使用爲幾乎每個數據類型定義的min()函數來選擇該行。
溶液2)ROW_NUMBER = 1從@vercelli是相同的溶液1)它由COL3 ASC保持第一值順序這是相同的MIN()
注意的! 解決方案3)外部申請來自@ gofr1是類似的,但它不保證輸出,頂部功能可以在每次運行時給出不同的結果,如果您沒有指定order by col3子句(優化程序將決定取決於在索引或羣集鍵上)。如果指定了它,它會給溶液1),溶液2)
你必須決定什麼TOP意味着你同樣的輸出,也可能是從SQL Server TOP功能的意義不同。
我認爲最好的辦法是用排序順序添加一列。
您可以使用整數列,例如1,2,3作爲排序順序,也可以使用標識。 在這種情況下,你也將有「插入順序」
我將避免OUTER APPLY,因爲它對於T1中的每一行執行,它比其他解決方案更慢。
謝謝,我從你那裏瞭解到很多評論! –
GROUP BY/MIN() –
「(頂部一個)」 - 在這種情況下,您如何定義*頂部?表格沒有固有的順序。那麼,它是具有*最低*'col3'值的行嗎?或者使用其他一些規則(此處未顯示)列? –
@ AllanS.Hansen,如果col3中的值是「a,b,c」而不是「10,20,30」?是MIN作品嗎? –