2016-06-14 26 views
2

我該怎麼辦內部聯接,並從具有相同的列行只選擇一排?如何接收特定行的內連接SQL

例如:

enter image description here enter image description here

如果我執行查詢:

SELECT t1.col1, t2.col3 
FROM t1 INNER JOIN t2 
ON t1.col2=t2.col2; 

我會得到表

enter image description here

不過,我想只得到一個行(最上面的一個),每個值在COL1

enter image description here

任何想法?

謝謝!

+0

GROUP BY/MIN() –

+2

「(頂部一個)」 - 在這種情況下,您如何定義*頂部?表格沒有固有的順序。那麼,它是具有*最低*'col3'值的行嗎?或者使用其他一些規則(此處未顯示)列? –

+0

@ AllanS.Hansen,如果col3中的值是「a,b,c」而不是「10,20,30」?是MIN作品嗎? –

回答

0

您可以使用查詢類似如下:

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; 
+1

沒有。這將給出col3的最小值不是第一個值 –

+2

@ChaosLegion沒有* first value *這樣的東西。 SQL表是*無序集*,優先級由特定列管理。從OP中提供的上下文中,我假定這種情況下的字段是'col3'。 –

+0

是的。他的要求是首位。你的答案難以改變嗎? –

3

你可能想嘗試的窗口函數與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; 
+0

謝謝,一個好主意! –

2

另一種方式適用於:

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 
+0

謝謝!我不知道「外部適用」。 –

+1

偉大的,如果你發現新的東西!更多的技術細節和例子,你可以從這裏獲得https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/ – gofr1

1
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 
+0

謝謝!它就像@vercelli提供的解決方案一樣。 –

+0

@OrK:不一樣,因爲您可能有多行rank = 1 – vercelli

+0

同意@vercelli,但這可以解決您的問題。 –

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中的每一行執行,它比其他解決方案更慢。

+0

謝謝,我從你那裏瞭解到很多評論! –