2016-06-14 6 views
2

内部結合を実行して、同じ列を持つ行から1行だけを選択するにはどうすればよいですか?例えば内部結合で特定の行を受け取る方法

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

"(トップ1)" - このような状況ではどうやって*定義するのですか?テーブルには固有の順序はありません。だから、* 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 *最初の値*は存在しません。 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:ランク= 1の複数の行を持つ可能性があるため、同じではありません。 – vercelli

+0

@vercelliで同意しますが、これは問題に対応します。 –

1

すべての回答は正しいですが、いくつかは、予測できない出力(予測不可能な出力)につながります(非決定的)。

溶液1)グループ分/分 @AllanS.Hansenおよび@GiorgosBetsosから、t1の各行に対してt2の行が1つだけ表示されます。 ほとんどすべてのデータ型に対して定義されたmin()関数を使用して、行が選択されます。

溶液2)ROW_NUMBER = @vercelliから1は、このMIN()

注意を払うのと同じであることがcol3というASCで最初の値の順序を保つ1)の溶液と同じです! ソリューション3)外部適用 @ gofr1は類似していますが、出力を保証するものではありません。orderをcol3節で指定しないと、各関数の実行時に異なる結果が得られます(オプティマイザは、インデックスまたはクラスタ化されたキー)。あなたはそれを指定した場合、それは解決策1)及び2溶液)あなたはTOPがあなたのために何を意味するのかを決定する必要があり

の同じ出力が得られますが、それは、SQL ServerのTOP機能の意味とは異なる可能性があります。

ソート順の列を追加するのが最善の解決策だと思います。

ソート順に1,2,3などの整数列を使用することも、同一性を使用することもできます。あなたも、それはT1の行ごとに実行され、それが他のソリューションよりも遅いので、私はOUTERがを適用避けるだろう「挿入順

を持つことになります。この場合 。

+0

ありがとう、私はあなたからたくさんのことを学んだ! –

関連する問題