如何找到哪个属性值只包含一种类型的值?

时间:2017-12-14 15:09:19

标签: sql oracle

我的问题可能不太清楚,但基本上我有一个带有邮政编码的表格,我需要查找邮政编码,我的所有记录都表明只有商业实体。

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

4 个答案:

答案 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;

D E M O 1

D E M O 2 ( go&press execute )