0

t1のソースIDがt2にないt1のレコードを表示しようとしています。

のように...「他のテーブルに存在しないレコードは何ですか?」

FROM句にt2を含める必要がありますか?ありがとう

SELECT t1.fee_source_id, t1.company_name, t1.document
FROM t1
WHERE t1.fee_source_id NOT IN (

     SELECT t1.fee_source_id
     FROM t1 INNER JOIN t2 ON t1.fee_source_id = t2.fee_source

                              )
ORDER BY t1.aif_id DESC 
4

2 に答える 2

1

MySQL には次の 3 つの可能性があります。

  1. 使用IN:

    SELECT fee_source_id, company_name, document
    FROM   t1
    WHERE  fee_source_id NOT IN (SELECT fee_source FROM t2)
    ORDER BY aif_id DESC
    
  2. 使用EXISTS:

    SELECT fee_source_id, company_name, document
    FROM   t1
    WHERE  NOT EXISTS (
      SELECT * FROM t2 WHERE t2.fee_source = t1.fee_source_id LIMIT 1
    )
    ORDER BY aif_id DESC
    
  3. 使用JOIN:

    SELECT   t1.fee_source_id, t1.company_name, t1.document
    FROM     t1 LEFT JOIN t2 ON t2.fee_source = t1.fee_source_id
    WHERE    t2.fee_source IS NULL
    ORDER BY t1.aif_id DESC
    

@Quassnoiの分析によると:

概要

MySQL は、3 つのメソッドすべてを最適化して、一種のNESTED LOOPS ANTI JOIN.

から各値を取得t_leftし、 のインデックスで検索しt_right.valueます。インデックス ヒットまたはインデックス ミスの場合、対応する述語はそれぞれすぐにFALSEまたはTRUEを返し、 から行を返すかどうかの決定は、t_left内の他の行を検査せずにすぐに行われt_rightます。

ただし、これら 3 つのメソッドは、3 つの異なるコードによって実行される 3 つの異なるプランを生成します。EXISTS述語を実行するコードは、メソッドを使用するように最適化されて実行されるコードよりも約30%効率が低くなります。index_subqueryLEFT JOINNot exists

そのため、MySQLで欠損値を検索する最善の方法は、ではなくLEFT JOIN / IS NULLorを使用することです。NOT INNOT EXISTS

ただし、この分析が MySQL マニュアルの「戦略を使用したサブクエリの最適化EXISTS」セクションとどのように一致するかは完全にはわかりません。(私の読みでは)上記の 2 番目のアプローチが最初のアプローチよりも効率的であることを示唆しています。

于 2012-12-23T19:22:19.220 に答える
0

以下の別のオプション(反結合に似ています)...しかし、上記の素晴らしい答え。ありがとう!

 SELECT   D1.deptno, D1.dname
        FROM     dept D1
        MINUS
        SELECT   D2.deptno, D2.dname
        FROM     dept D2, emp E2
        WHERE    D2.deptno = E2.deptno
        ORDER BY 1;
于 2012-12-23T19:37:16.737 に答える