代码之家  ›  专栏  ›  技术社区  ›  Boolean

获取不属于联接的行的SQL查询

  •  5
  • Boolean  · 技术社区  · 14 年前

    我在下面吃饭。

    create table test(int id,int data1);
    create table test1(int id,int data2);
    
    insert into test values(1,1,);
    insert into test1 values(2,2);
    insert into test1 values(3,3);
    
    insert into test1 values(1,1);
    

    现在我要的是不参与联接的测试行。也就是说,我需要行(2,2)和(3,3)。我想在MySQL中实现这一点。

    由于性能原因,我不想使用内部查询。

    谢谢你

    3 回复  |  直到 14 年前
        1
  •  9
  •   OMG Ponies    14 年前

    使用左联接/为空:

       SELECT t1.*
         FROM TEST1 t1
    LEFT JOIN TEST t ON t.id = t1.id
                    AND t.data1 = t1.data2
        WHERE t.id IS NULL
    

    Assuming the columns being joined on, this is the fastest/most efficient method on MySQL . 否则,不在/不存在是更好的选择。

    使用不存在:

    SELECT t1.*
      FROM TEST1 t1
     WHERE NOT EXISTS(SELECT NULL
                        FROM TEST t
                       WHERE t.id = t1.id
                         AND t.data1 = t1.data2)
    
        2
  •  4
  •   Fosco    14 年前

    如果不使用子查询(甚至是我喜欢的现有类型),则需要执行左联接并获取未联接的记录,如:

    select a.* from test1 a
    left join test b on a.id = b.id and a.data2 = b.data1
    where b.id IS NULL
    
        3
  •  0
  •   user353283    14 年前

    也许是工会的事?

    select * from test as a
       left outer join test1 as o on a.id = o.id
    union all
    select * from test as a
       right outer join test1 as o on a.id = o.id
    where a.id is null;
    

    我假设如果独占加入,您希望实现什么。
    http://www.xaprb.com/blog/2005/09/23/how-to-write-a-sql-exclusion-join/