查找在另一行中找不到列的值的行

时间:2014-07-15 23:46:10

标签: sql sql-server

似乎无法使此SQL查询正常工作!我已经找到了答案,尽管有些帖子很接近,但他们只是错过了标记。

给定一个表Table1,列Key1 (int), Key2 (int), and Type (varchar) ...

我想把行放在哪里      Type等于'TypeA'Key2等于Null  在表中没有对应的行      Type等于'TypeB'Key2等于来自另一行的Key1

所以,给定数据

**KEY1**     **Key2**     **Type**
   1           NULL         TypeA
   2           5            TypeA
   3           1            TypeB
   4           NULL         TypeA
   5           NULL         TypeB

我想只返回Key1 = 4的行,因为该行符合Type =' TypeA' / Key2 = NULL且没有Type ='的对应行。 TypeB' / Key1 =来自另一行的Key2。

我试过这个但它没有用......

SELECT t1.Key1, t1.Key2, t1.Type
FROM Table1 t1
WHERE t1.Key2 IS NULL 
    AND t1.Type LIKE 'TypeA'
    AND t1.Key1 NOT IN
        (SELECT Key1
            FROM Table1 t2
            WHERE t1.Key1 = t2.Key2
                AND t1.Key1 <> t2.Key1
                AND t2.Type LIKE 'TypeB')

1 个答案:

答案 0 :(得分:1)

我不是子查询的最大粉丝。

select t1.Key1, t1.Key2, t1.Type
from table1 t1
left join table1 t2 
          on t1.key1 = t2.key2 
          and t2.type = 'typeb'
where t1.type = 'typea' 
      and t1.key2 is null 
      and t2.key1 is null

我认为那里的逻辑是正确的。我们正在使用表1,其中t1.key2为null并且t1.type ='typea'...将其自身连接为t2,其中t2.type ='typeb'。每次找到t2.type b记录时,我们都要省略它,所以t2.key1(或任何t2字段)为空。

逻辑有意义吗?试一试,让我知道