1

次の表があります。

____________________________________
| carid | changeid | data1 | data2 | 
|_______|__________|_______|_______|
| 1     | 1        |a      |b      |
| 1     | 2        |c      |d      |
| 1     | 3        |e      |f      |
| 2     | 3        |g      |h      |
| 2     | 2        |i      |j      |
| 2     | 4        |k      |l      |
| 3     | 5        |m      |n      |
| 3     | 1        |o      |p      |
| 4     | 6        |q      |r      |
| 4     | 2        |s      |t      |
|_______|__________|_______|_______|

次の結果を選択したい:


| carid | changeid | data1 | data2 | 
|_______|__________|_______|_______|
| 1     | 1        |a      |b      |
| 1     | 2        |c      |d      |
| 1     | 3        |e      |f      |
| 3     | 5        |m      |n      |
| 3     | 1        |o      |p      |
|_______|__________|_______|_______|

つまり、行に changeid=1 がある場合、changeid=1 の行と同じ carid を持つすべての行を選択したいと考えています。

この問題は、複数選択を使用したクエリで簡単に解決できます。最初に changeid=1 のすべての行を選択し、それらの carid を取得して、それらの carid を持つすべての行を選択します。十分に単純です。

複数の選択を使用せずにこの問題を解決できるかどうかもっと疑問に思っていましたか? できれば、より高速なソリューションを探していますが、自分で試すことができます。

4

4 に答える 4

3

テーブルをそれ自体に結合できます

SELECT DISTINCT a.*
FROM YourTable a
INNER JOIN YourTable b ON b.carid = a.carid and b.changeid = 1

テーブル a は、セットを changeid = 1 のセットに制限するテーブル b によってフィルター処理された、出力するすべての行です。

すべてがセット指向の方法で行われるため、これは優れたパフォーマンスを発揮するはずです。

DISTINCTchangeid 1 が 1 回だけ発生する可能性がある場合は必要ない可能性があります。大きな結果セットではパフォーマンスが大幅に低下する可能性があるため、可能であれば避ける必要があります。

于 2013-07-09T14:02:55.713 に答える
1

複数選択の場合、INを使用することを意味しますか?

SELECT carid, changeid, data1, data2
FROM YourTable
WHERE carid IN (SELECT carid FROM YourTable WHERE changeid = 1)
于 2013-07-09T13:43:36.127 に答える
-2

テーブルに存在する carid と changeid の組み合わせのみを求めているように思えます。この場合、DISTINCT は一意の組み合わせのみを返します。それがあなたの求めているものかどうかはわかりませんが、試してみて、予想される動作を確認してください...

SELECT DISTINCT CARID, CHANGEID FROM UnknownTable
于 2013-07-09T13:43:52.877 に答える