创建一个VIEW,其中t1中的记录不存在于t2中?对Union / Left Join / Inner Join的确认?

时间:2012-12-23 19:15:29

标签: mysql

我试图在t1中查看记录,其中来自t1的源id不在t2中。

喜欢......“其他表格中没有哪些记录?”

我是否需要在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 

2 个答案:

答案 0 :(得分:1)

您希望实现反连接,在MySQL中有三种可能性:

  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
    
  4. 根据@Quassnoi's analysis

      

    摘要

         

    MySQL可以优化所有三种方法来进行NESTED LOOPS ANTI JOIN

         

    它将从t_left中获取每个值,并在t_right.value的索引中查找。如果索引命中或索引未命中,相应的谓词将分别立即返回FALSETRUE,并且将立即从t_left返回行的决定而不检查t_right中的其他行。

         

    然而,这三种方法生成三个不同的计划,由三个不同的代码执行。执行EXISTS谓词的代码 30%效率低于执行index_subqueryLEFT JOIN优化使用Not exists方法的代码。

         

    这就是为什么在 MySQL 中搜索缺失值的最佳方法是使用LEFT JOIN / IS NULLNOT IN而不是NOT EXISTS

    但是,我不完全确定这个分析如何与Optimizing Subqueries with EXISTS Strategy上的MySQL手册部分协调一致(我的阅读)表明上面的第二种方法应该更高效第一个。

答案 1 :(得分: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;