我的问题可能不太清楚,但基本上我有一个带有邮政编码的表格,我需要查找邮政编码,我的所有记录都表明只有商业实体。
表
ID zip entity
1 1111 F
2 1111 R
3 1111 C
4 1112 C
5 1112 C
6 1112 C
7 1113 Z
8 1113 S
9 1113 X
返回值
1112
答案 0 :(得分:6)
您想要的邮政编码只有entity
' C'。检查这一点的简单方法是查看entity
的最小值和最大值;两者都必须是C'
select zip
from mytable
group by zip
having min(entity) = 'C' and max(entity) = 'C';
答案 1 :(得分:2)
有几种可爱的方法来获得你想要的东西。就个人而言,除非性能要求,否则我喜欢坚持直截了当的方法。这对我来说似乎是最清楚的:
SELECT DISTINCT T1.zip
FROM MyTable T1
WHERE
NOT EXISTS (SELECT * FROM MyTable T2 WHERE T2.zip = T1.zip AND T2.entity <> 'C')
IMO的优势在于,通过查看代码可以清楚地看到它正在尝试做什么,因此当您在六个月内再次查看代码时,您不会感到头疼。
答案 2 :(得分:2)
选择所有商业邮政编码减去非商业邮政编码
为了解决方案的多样性,我提交了这个解决方案。
减号运算符会删除任何包含商业和非商业实体的邮政编码。
SCOTT@db>SELECT
2 zip
3 FROM
4 tbl
5 WHERE
6 entity = 'C'
7 GROUP BY
8 zip
9 MINUS
10 SELECT
11 zip
12 FROM
13 tbl
14 WHERE
15 entity != 'C'
16 GROUP BY
17 zip;
ZIP
1112
答案 3 :(得分:1)
此外,这可能是另一种选择(p^q'
逻辑):
select zip
from mytable
group by zip
having sign(sum( decode(entity,'C',1,0) ) ) * ( 1 - sign(sum( decode(entity,'C',0,1) ) )) = 1;