我有两张桌子,T1和T2。
T1
C1 | GROUP | SECTOR
而T2是
CODE | C1 | GROUP | SECTOR
我必须从属于特定组的T2中选择行并且代码为100.这些行通常必须被处理,特别是必须插入表T3中:
C1 | GROUP | SECTOR
但是,如果至少有一个扇区,则在T1中
C1 > 0
,属于同一个GROUP,必须排除这个T2行。
所以,我对T2的选择查询是:
select C1,C2,GROUP,SECTOR from T2 where CODE=100 group by(C1,C2,GROUP,SECTOR);
--adding C1,C2 and SECTOR to group by because I need their values...
T1上的那个:
select C1,C2,GROUP from T1 group by (C1,C2,GROUP) having C1>0
现在我必须这样做:
first_selection minus second_selection
但是,正如您所看到的,第一个选择有SECTOR列而第二个选择没有,所以我不知道如何排除它!
实施例: T1:
0|A|A1
2|A|A2
0|B|B1
0|B|B2
T2:
100|A|A1
100|A|A2
100|B|B1
T2上的第一个选择给了我" A"," B"。无论如何,在T1中你得到扇区A2包含C1> 0(2),所以必须排除A. " B"很好,因为T1中的每一行都有C1 = 0。
答案 0 :(得分:2)
你几乎可以按字面编码
select * from T2 where code = 100
and not exists (select NULL from T1 where
T1.group = T2.group and
T1.c1 > 0)
即。你需要T2.code = 100的所有记录,其中不存在T1中的记录 具有相同的组(T1.group = T2.group)和T1.c1> 0。 子查询中的select NULL可能看起来很奇怪,你可能会写而不是null,例如'找到了什么' 关键是NOT EXISTS只检查子查询是否返回一些记录 - 该值是无趣的。