【问题标题】:query with join of 3 tables查询 3 个表的连接
【发布时间】:2011-12-13 03:19:50
【问题描述】:

我想要一个查询来产生以下结果..

产生在 table1 和 table2 中但不在 table3 中的记录。

每个表中有超过 10,000 条记录..所以我正在寻找一个高效的记录。在所有表中 Cono 是主键..

详细的表格。

表 1:-

Cono     

th-123
th-124
th-125

表 2:-

Cono     

th-234
th-245
th-256

表 3:-

Cono     

th-124
th-125
th-256

现在我想有以下记录

结果表:-

Cono     

th-123
th-234
th-245

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    试试这个

    WITH Table1 AS
    (
        SELECT 'th-123' CONO UNION
        SELECT 'th-124' UNION
        SELECT 'th-125'
    )
    ,
    Table2 AS
    (
        SELECT 'th-234' CONO UNION
        SELECT 'th-245' UNION
        SELECT 'th-256'
    )
    ,
    Table3 AS
    (
        SELECT 'th-124' CONO UNION
        SELECT 'th-125' UNION
        SELECT 'th-256'
    )
    
    SELECT CONO
    FROM Table1 
    WHERE NOT EXISTS
    (
        SELECT 1
        FROM Table3
        WHERE TABLE1.CONO = TABLE3.CONO
    )
    
    UNION ALL
    
    SELECT CONO
    FROM Table2
    WHERE NOT EXISTS
    (
        SELECT 1
        FROM Table3
        WHERE TABLE2.CONO = TABLE3.CONO
    )
    

    【讨论】:

    • 在这种情况下我们可以使用 UNION ALL
    • @Vash,你的假设是基于什么We can use UNION ALL in this case?对于 OP 的简单示例数据,UNION ALL 会起作用,但它会是生产中的正确方法吗?谁知道。我更喜欢使用它,因为它更快,但除非 OP 提供更多信息,否则我不会做出这种假设。
    • 正如我所提到的,每个表中有超过 10,000 条记录。比如我只写了3个。那么我需要提到,table1作为所有记录吗?
    • 这只是我们可以提供的一个提示(基于提供的数据示例),而不是他必须使用它。您完全正确的假设是,在这两个表中,生产数据库中的某些条目可能会加倍。
    【解决方案2】:

    试试这个:

    select t.cono from Table1 t WHERE NOT EXISTS (SELECT 1 
                                                  FROM Table3 x WHERE x.cono=t.cono)
    UNION
    select t.cono from Table2 t WHERE NOT EXISTS (SELECT 1 
                                                  FROM Table3 x WHERE x.cono=t.cono)
    

    【讨论】:

      【解决方案3】:
      (SELECT t1.Cono FROM table1 t1
      LEFT JOIN table3 t3
      ON t3.Cono = t1.Cono
      WHERE t3.Cono IS NULL)
      UNION ALL
      (SELECT t2.Cono FROM table2 t2
      LEFT JOIN table3 t3
      ON t3.Cono = t2.Cono
      WHERE t3.Cono IS NULL)
      

      【讨论】:

      • exists 将比 left join 更快,UNION ALL 也可能会创建重复项,OP 的数据尚未得到充分解释,无法假设 table1.cono 和 table2.cono 值不重叠。
      • @KM,请提供说明存在更快的参考。
      • 见这篇文章:explainextended.com/2009/06/16/in-vs-join-vs-exists 它基本上说 JOIN 和 EXISTS 有时会有相同的执行计划,有时不会。但是,当它们不存在时,EXISTS 会稍微快一些。
      【解决方案4】:

      有些模糊的表和名称,但如果您真的想在一个查询中完成,可以这样做:

      SELECT Cono
      FROM Table3
      WHERE NOT EXISTS ( SELECT Cono
                         FROM TABLE1 as T
                         WHERE EXISTS ( SELECT *
                                        FROM TABLE2
                                        WHERE T.Cono = TABLE2.Cono));
      

      这应该选择表 3 中在括号中创建的查询中不存在的值,该表是由表 1 和表 2 中的行组成的表。

      不幸的是,嵌套和效率通常不会齐头并进...

      【讨论】:

        【解决方案5】:

        这个对我有用......并且处理速度很快:

        select X.FID, c.id as CID 
        from
        (
            select a.id as FID from tbl1 a
            union 
            select b.id as FID from tbl2 b
        ) as X
         left outer join tbl3 c on FID = c.id
        where
            c.id is null
        ;
        

        【讨论】:

          【解决方案6】:

          试试这个(未测试):

          ; WITH all_data AS (
             SELECT * FROM table1
             UNION ALL
             SELECT * FROM table2
          )
          SELECT * 
          FROM all_data ad
          WHERE NOT EXISTS (
             SELECT *
             FROM table3 t3
             WHERE ad.Cono = t3.Cono);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-09
            • 2015-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-16
            • 2012-01-14
            • 2018-04-25
            相关资源
            最近更新 更多