1
2つの列がid
とval
のテーブルがあるとします。私は全く同じと反対のものが存在するところにある別のすべてのid
を見つけることを望んでいませんでしたval
。たとえば、次の表等しい値と反対の値のSQL照会
id | val
------+------
1 | 3
2 | 5
2 | -5
1 | 4
2 | 6
3 | 9
2 | -6
3 | -9
があると私は結果が値5, -5
と6, -6
があるので、結果セットに
result
2
3
2
になりたいです。 9, -9
のため、3
が結果セットに含まれています。
where exists
を使用してこれを行うことができます。
select distinct tab1.id from tab tab1
where exists (
select * from tab tab2
where tab1.id = tab2.id
and tab1.val = -tab2.val
);
ような何かはしかし、私はそれは、ネストされたループのように計算されるので、このようなクエリは、時間複雑O(n^2)
を持っていることを心配します(?)。しかし、これを計算するには、O(n)
時間でテーブルをスキャンして(そして、以前に見た結果を、O(1)
ルックアップ時間のデータ構造に記録する)ことができます。そのようなクエリを書く最適な方法は何ですか?
パフォーマンスを前提とする前に、クエリプランをチェック(および投稿)します。 –
ここにネストされたループはありません。おそらく少しのデカルト製品の状況の種類、しかし何もひどい。それは、INNER JOIN(これもこの状況で動作する)と同様に機能しなければならない良い相関サブクエリのように見えます。 – JNevill