似乎无法使此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')
答案 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字段)为空。
逻辑有意义吗?试一试,让我知道