内部結合を実行して、同じ列を持つ行から1行だけを選択するにはどうすればよいですか?例えば内部結合で特定の行を受け取る方法
:
私は、クエリを実行した場合:
SELECT t1.col1, t2.col3
FROM t1 INNER JOIN t2
ON t1.col2=t2.col2;
は私がテーブルを取得します
しかし、私はCOL1
に値ごとに任意のアイデアを一つだけ行(一番上)を受信したいですか?
ありがとうございます!
内部結合を実行して、同じ列を持つ行から1行だけを選択するにはどうすればよいですか?例えば内部結合で特定の行を受け取る方法
:
私は、クエリを実行した場合:
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 *最初の値*は存在しません。 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
ありがとう! @vercelliが提供する解決策のようなものです。 –
@OrK:ランク= 1の複数の行を持つ可能性があるため、同じではありません。 – vercelli
@vercelliで同意しますが、これは問題に対応します。 –
すべての回答は正しいですが、いくつかは、予測できない出力(予測不可能な出力)につながります(非決定的)。
溶液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がを適用避けるだろう「挿入順」
を持つことになります。この場合 。
ありがとう、私はあなたからたくさんのことを学んだ! –
GROUP BY/MIN() –
"(トップ1)" - このような状況ではどうやって*定義するのですか?テーブルには固有の順序はありません。だから、* col3という値を持つ行ですか?または他のいくつかのルール(ここには表示されていません)を使用する他のルールはありますか? –
@ AllanS.Hansenとcol3の値が "a、b、c"の代わりに "10,20,30"の場合はどうなりますか? MIN作品ですか? –