SQL减去列的子集:可能吗?

时间:2015-06-30 11:21:35

标签: sql oracle

我有两张桌子,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。

1 个答案:

答案 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只检查子查询是否返回一些记录 - 该值是无趣的。