1

パフォーマンスを向上させるために、クエリを NOT IS 句から左外部結合に変換しようとしています。

以下は完全に機能する私のクエリです

SELECT a.company_code, account_name, legal_name FROM accounts a

WHERE account_id NOT IN (SELECT DISTINCT  account_id FROM phone_calls WHERE status = 2 ) AND account_id >10000

ORDER BY legal_name, account_name, account_id

したがって、左結合または同じクエリを実行する何らかのタイプの結合に変更したいと考えています。私はこれを試しましたが、うまくいきません

SELECT a.company_code, a.account_name, a.legal_name, p.phone_call_id
FROM accounts AS a
LEFT JOIN phone_calls AS p ON p.account_id = a.account_id

WHERE a.account_id >= 10000 AND p.status = 2 AND p.phone_call_id IS NULL

ORDER BY a.legal_name, a.account_name, a.account_id

私の 2 番目のクエリは、常に何も返しません。

このクエリを試してみましたが、最初のクエリよりも多くの結果が得られるため、同じではありません

SELECT a.company_code, a.account_name, a.legal_name, p.phone_call_id
FROM accounts AS a
LEFT JOIN phone_calls AS p ON p.account_id = a.account_id AND p.status = 2 AND a.account_id >= 10000

WHERE p.account_id IS NULL

ORDER BY a.legal_name, a.account_name, a.account_id
4

2 に答える 2

3

句ではなくp.status = 2、句にチェックを入れる:joinwhere

SELECT a.company_code, a.account_name, a.legal_name, p.phone_call_id
FROM accounts AS a
LEFT JOIN phone_calls AS p ON p.account_id = a.account_id AND p.status = 2
WHERE a.account_id >= 10000  
AND p.phone_call_id IS NULL

ORDER BY a.legal_name, a.account_name, a.account_id

where句に入れるとphone_callsが結合され、結合後にチェックします

  • その p.status=2
  • その p.phone_call_id IS NULL

これらのステートメントはおそらく完全に競合しています (status = 2 のすべての phone_calls には ID があります)。

また、一般に、WHERE 句で左結合テーブルに句を使用しないでください ( IS NULL/を除くIS NOT NULL)

于 2013-06-11T21:01:29.080 に答える
0

NOT EXISTSちょっと興味がありますが、節を使ってみてください:

SELECT company_code
     , account_name
     , legal_name 
FROM   accounts a
WHERE  account_id > 10000
   AND NOT EXISTS (
      SELECT 1 
      FROM phone_calls b
      WHERE b.status = 2 
        AND b.account_id = a.account_id
      )
ORDER BY legal_name, account_name, account_id

EXPLAINどちらがより優れた技術であるかは、明らかになるだろうと思います。選択されていない列で結果を並べ替えるのは奇妙に思えますが、それは別の問題です。

于 2013-06-11T21:33:43.770 に答える