需要编写一个sql查询:另一个特定值只能有一个值

时间:2011-02-17 20:16:16

标签: sql oracle

例如,在表ADDRESSE中有一列ZIP_CODE。邮政编码可以是任何内容,例如90210,45430,45324。可以有多个90210或任何其他邮政编码的实例。但对于任何邮政编码,在STATE列中只能有一个值。如果90210在邮政编码列中,则STATE列必须为CA,如果有另一条记录包含90210且具有OH或GA或其他任何内容,则表示不正确。我希望找到这些特定的邮政编码,这些邮政编码在这个其他列中只有一个值。 这不是一个家庭作业问题。

4 个答案:

答案 0 :(得分:3)

select zip_Code, count(distinct state)
from address
group by zip_code
having count(distinct state) > 1;

答案 1 :(得分:2)

试试这个:

select zip_code, count(*)
  from (select distinct zip_code, state
          from address)
 group by zip_code
having count(*) > 1;

答案 2 :(得分:0)

select count(*), zip_code 
from address 
group by zip_code 
having count(*) > 1

答案 3 :(得分:0)

设计此方法的最明确方法是使用包含邮政编码和状态的每个允许组合的表,然后将这两列用作包含实际地址的表的外键。这样,任何无效的状态/ ZIP组合都会违反外键约束。只要您不使查找表的邮政编码字段成为唯一键,即使邮政编码跨越州行,此方法也可以使用。这种方法的缺点是你需要预先填充查询表并使其保持最新状态,这意味着支付USPS的列表。

如果您真的坚持采用单ZIP状态和/或不想从USPS购买列表,您仍然可以使用类似的方法。同样,您需要一个包含状态和ZIP的查找表,但这次您需要使ZIP成为唯一键。当记录添加到包含地址的表中时,您可以使用触发器在邮政编码尚不存在时填充查找表。这会增加一点开销,但在大多数情况下还不够担心。