7

句で複数回使用される同じサブクエリを含むクエリを実行しています。WHERE

client_id2 つのフィールドを持つテーブルがありますbuyer_id

サブクエリは、結果から除外する日付のリストを返します。

これが私がそれを使用している方法です。

SELECT
  id, client_id, buyer_id
FROM relation
WHERE
  client_id NOT IN (SELECT <some_id> FROM <some_table> WHERE ...)
  AND buyer_id NOT IN (SELECT <some_ids> FROM <some_table> WHERE ...)

これは期待どおりに機能していますが、同じサブクエリが 2 つあることが気になります。一度使って、その結果を両方の場所に使用できる方法があるのだろうか。

ありがとう。

4

4 に答える 4

3

を使用してこれを書くことができますNOT EXISTS

SELECT
    id, client_id, buyer_id
FROM relation AS r
WHERE NOT EXISTS
      ( SELECT 1 
        FROM <some_table> 
        WHERE (r.client_id = <some_id> OR r.buyer_id = <some_id>) 
          AND ...
      ) ;
于 2013-06-12T11:51:24.473 に答える
1

フォームのクエリ:

select ...
from <main query>
where <select field> not in (select <subquery field> from <subquery>)

通常、次のように再定式化できます。

select <main query fields>
from <main query>
left join <subquery> on <select field> = <subquery field>
where <subquery field> is null

使用しているサブクエリがclient_idとbuyer_idの両方でまったく同じである場合、クエリを次のように再構築できるはずです。

SELECT id, client_id, buyer_id
FROM relation
LEFT JOIN <some_table> ON <some_id> IN (client_id, buyer_id)
WHERE <some_id> IS NULL

- したがって、サブクエリをクエリで 1 回だけ効果的に使用します。

于 2013-06-12T11:39:41.593 に答える
0

取得した値を別のデータベース テーブルに入れてみると、結果が既に別のテーブルにある場合に、類似した結果値があるかどうかを判断できるようになります。あなたの議事録からの連絡を待っています...頑張ってください。

于 2013-06-12T11:46:45.910 に答える
0

クエリは次のように変換できます。

SELECT
  id, client_id, buyer_id
FROM relation
LEFT JOIN some_table
) AS subquery ON ( subquery.some_id IN (client_id, buyer_id) AND <condition that was in your subquery>)
WHERE subquery.some_id IS NULL;

しかし、実行時間に関しては、これでもパフォーマンスが非常に悪いと感じています。

サブクエリの内容を保持する一時テーブルを作成することを検討してください。

于 2013-06-12T11:40:02.667 に答える