fromcolAにないすべての値を返す必要があります。私は使っている:colBmytable
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)
動作していますが、クエリが完了するまでに非常に長い時間がかかっています。
これを行うより効率的な方法はありますか?
fromcolAにないすべての値を返す必要があります。私は使っている:colBmytable
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)
動作していますが、クエリが完了するまでに非常に長い時間がかかっています。
これを行うより効率的な方法はありますか?
標準 SQL では、 に括弧はありませんDISTINCT colA。DISTINCT関数ではありません。
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
使用できます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通常、テーブル内の値の方が高速です。