colA
からcolB
にない値をすべてmytable
から戻す必要があります。私が使用しています:それはしかし、働いている他の列にない1つの列のすべての値を効率的に選択する
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)
クエリが完了するまでに過度に長い時間がかかっています。
これを行うには、より効率的な方法はありますか?
colA
からcolB
にない値をすべてmytable
から戻す必要があります。私が使用しています:それはしかし、働いている他の列にない1つの列のすべての値を効率的に選択する
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)
クエリが完了するまでに過度に長い時間がかかっています。
これを行うには、より効率的な方法はありますか?
はDISTINCT colA
に括弧がありません。 DISTINCT
は機能ではありません。
SELECT DISTINCT colA
FROM mytable
WHERE colA NOT IN (SELECT DISTINCT colB FROM mytable);
サブセレクトにもDISTINCT
が追加されました。重複が多い場合は、クエリを高速化できます。
DBMSに応じて、CTEがより高速になる場合があります。私は、さらにvalB
に値を除外するために、代替としてLEFT JOIN
を発揮し、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
にする必要があります。
ありがとう、私はしようとしました: 'SELECT DISTINCT m1.colA from mytable m1 LEFT JOIN mytable m2 ON(m1.colA = m2.colB)m2.colAはNULL ORDER BY m1です。colA ASC'となり、数桁速く動作しているようです。これは質問に投稿したコードと同じですか?私が何かを逃してしまったかもしれないという疑いがあるのはずっと速いです。 – Flash
@Andrew:申し訳ありませんが、あなたの質問には誤字があります。 'WHERE m2.colB IS NULL'でなければなりません。 'colB'の値が重複している場合は、** LE ** JOIN(SELECT DISTINCT colB FROM mytable)m2 m2.colB = m1.colA' **の方が速いかもしれません。 –
@Andrew: 'm2.colA'はここで' m2.colB'がNULLの場合は常に 'NULL'ですが、' m2.colB'がNULLでなくてもNULLにすることができます。だから正しい(そして速い!)形式は、 'WHERE m2.colB IS NULL'です。 ** ** 'colA'がNOT NULLに定義されている場合、上記のクエリは正しいです。 –
あなたは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
は通常、テーブルの値が高速です。
'NOT IN'はセットサイズが大きくなるにつれて減速し、' NOT IN'節に含まれる行の数には限界があります。小さな結果セット以外では、2つの結果セットの違いを得るために他の手段を使用する方が良いことがわかりました。 – Paul
パフォーマンスについて言及するときは、RDBMSに名前を付けるか、次善の回答を得る必要があります。 –