2016-04-18 6 views
0

以下は、IDが別のテーブルの外部キーであるデータの例です(このテーブルはテストと呼ばれます)。外部キーごとに1行だけが必要な場合SELECTで行われるSQLの削減作業

+------+------+ 
| id | data | 
+------+------+ 
| 1 | 100 | 
| 1 | 110 | 
| 1 | 105 | 
| 2 | 105 | 
| 2 | 150 | 
| 2 | 120 | 
| 2 | 320 | 
| 3 | 300 | 
| 3 | 400 | 
| 3 | 500 | 
+------+------+ 

(私が探しています結果を与える)私が実行したSELECTステートメントがある:それはWHERE句の条件に一致する場合

select distinct(id) from test where data < 160 and data > 130; 

このクエリは、外部キーを返します。これにより、後で使用できる外部キーの固有のリストが得られます。

私の理解では、この状況ではdistinctを使用しても、実行される作業は軽減されず、すべての重複の結果セットのみがフィルタリングされます。つまり、行に一致する一意の外部キーがありますが、

| 2 | 150 | 

残りの行はまだチェックされています。

特定の外部キーの一致がすでに検出されているかどうかを確認し、WHERE句を使用してデータ列をテストしていないかどうかを最初に確認するクエリを作成できますか?

+0

使用しているデータベースをOracleまたはMySQLに決定してください。 –

+1

'distinct()'は関数ではありません。 'distinct distinct(id)'は "適切な"構文ですが、キーワードとしての 'distinct'は'() 'にリストされているフィールドだけでなく、フィールドの全行に適用されます。そうでなければ、はい。 'where'フィルタが適用されると、以前に見つかったすべての行が検査され、現在の行が前の行のいずれかの列になるかどうかがチェックされます。 –

+0

@ GordonLinoffいずれかの解決策は問題ありません。したがって両方のタグ。 –

答えて

1

一般に、select distinctは凝集を行っています。集計は、データベースによっては面倒な操作になる可能性があります。

パフォーマンスが考慮された場合は、次のようなクエリ検討するかもしれない:

select rt.id 
from referencetable rt 
where exists (select 1 from test t2 where t2.id = rt.id and t2.data < 160 and t2.data > 130); 

referencetableidが主キーであるテーブルです。

このクエリの利点は、参照テーブルを読み取ってからtestの値(おそらく(id, data)のインデックスにある)を検索することです。重複排除はないので、多くの状況下では、これはより速いアプローチかもしれません。いつもではなく、しばしば。

関連する問題