3

同じサブクエリを 2 回使用する SQL スクリプト (現在 SQLite に対して実行されていますが、おそらくどの DB エンジンに対しても機能するはずです) があります。一度だけ呼び出したい。

クエリの短縮された疑似バージョンは次のようになります。

SELECT * FROM
    ([the subquery, returns a column of ids]) AS sq
[a couple of joins, that fetches things from other tables based on the ids]
WHERE thisorthat NOT IN ([the subquery again])

名前 ( sq) をさまざまな方法 (括弧の有無、sq の列の名前の有無など) で使用しようとしましたが、役に立ちませんでした。

本当にこのサブクエリを繰り返す必要がありますか?

明確化: 私は何ができるかの小さなデモとして python と sqlite でこれを行っていますが、可能な限り変更を加えずに可能な限りスケーリングするソリューションを望んでいます。実際の状況では、データベースには数百万行ありますが、私の例では、ダミー データを含む行は 10 行しかありません。したがって、たとえば MySQL で十分に最適化されるコードで十分です。特に SQLite 用に最適化する必要はありません。しかし、私が言ったように、必要な変更が少ないほど良い.

4

4 に答える 4

12

標準 SQL には句がありますが、WITHそれが SQLlite でサポートされているかどうかはわかりませんが、もちろん試してみる価値はあります。

WITH mySubQuery AS
(
  [the subquery code]
)

SELECT * FROM
    mySubQuery AS sq
    [a couple of joins, that fetches things from other tables based on the ids]
WHERE thisorthat NOT IN (mySubQuery)

とはいえ、ここで行うことは、数千行を超えるデータセットでは非常に遅くなる可能性が高いため、可能であれば改造を試みます -NOT IN一般的には避けるべきです。参加します。

于 2011-03-29T09:32:37.450 に答える
5

サブクエリは必要ですか?OUTER JOINおそらく次のようなものを使用して書き直すことができます。

SELECT * 
  FROM [the subquery's FROM clause] AS sq
       RIGHT OUTER JOIN [a couple of tables based on the ids]
          ON thisorthat = sq.[a column of ids]
 WHERE sq.[a column of ids] IS NULL;
于 2011-03-29T11:06:27.203 に答える
2

一般的に、私は重複を排除する必要性に疑問を持っています。SQL コンパイラは、2 つのサブクエリが同一であることを認識し、最適と思われる場合は 1 回だけ実行することを選択します。

さらに、ソースに重複を残すことで、SQL コンパイラーとオプティマイザーは重複を別の方法で処理できるようになります。たとえば、SQLite のサブクエリの平坦化の最適化は、重複のペアの 1 つに適用されるか、それぞれに異なる方法で適用される場合があります。セクション 9.0、https://www.sqlite.org/optoverview.htmlのサブクエリの平坦化を参照してください。

于 2012-08-05T21:12:44.713 に答える
0

エイリアス「sq」を使用してビューの結果をフィルタリングするよりも、SELECT部分​​をビューに入れることができます

お役に立てば幸いです

于 2011-03-29T09:33:17.367 に答える