12

fromcolAにないすべての値を返す必要があります。私は使っている:colBmytable

SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)

動作していますが、クエリが完了するまでに非常に長い時間がかかっています。

これを行うより効率的な方法はありますか?

4

3 に答える 3

22

標準 SQL では、 に括弧はありませDISTINCT colADISTINCT関数ではありません。

SELECT DISTINCT colA
FROM   mytable
WHERE  colA NOT IN (SELECT DISTINCT colB FROM mytable);

DISTINCTサブセレクトにも追加。重複が多い場合は、クエリが高速化される可能性があります。

DBMS によっては、CTE の方が高速な場合があります。さらにLEFT JOIN、 の値を除外する代替手段としてvalB、および を使用して個別の値を取得する代替方法を示しますGROUP BY

WITH x AS (SELECT colB FROM mytable GROUP BY colB)
SELECT m.colA
FROM   mytable m
LEFT   JOIN x ON x.colB = m.colA
WHERE  x.colB IS NULL
GROUP  BY m.colA;

または、さらに単純化して、単純なサブクエリを使用します (おそらく最速):

SELECT DISTINCT m.colA
FROM   mytable m
LEFT   JOIN mytable x ON x.colB = m.colA
WHERE  x.colB IS NULL;

別の (または同じ) テーブルに存在するキーを持つ行を除外するには、基本的に 4 つの手法があります。

速度の決め手はインデックスです。このクエリを高速にするcolAには、インデックスが必要です。colB

于 2012-01-05T03:07:45.543 に答える
6

使用できますexists

select distinct
    colA
from
    mytable m1
where
    not exists (select 1 from mytable m2 where m2.colB = m1.colA)

exists値をすばやく一致させるために準結合を行います。not in結果セット全体を完成させてから、それに対してを実行orします。exists通常、テーブル内の値の方が高速です。

于 2012-01-05T03:05:23.550 に答える
0

2つのクエリ EXCEPTを効果的に比較する演算子を使用できます。一意の値のみを返します。Oracleの演算子は。と同等です。SELECTEXCEPT DISTINCTMINUSEXCEPT DISTINCT

于 2012-01-05T03:13:52.283 に答える