2014-12-10 30 views
0

我有一个MySQL表的地址有以下的列:找出一个SQL表是否有条目没有“标记”记录

STATE, ZIPCODE, FLAG 

可以有一个给定state/zipcode组合多行。我想确保对于每个给定的state/zipcode组合,只有一行有FLAG = 'P'

我知道如何检查多行:

SELECT state, zipcode, flag, count(*) as numrecs 
FROM addresses 
WHERE flag = 'P' 
group by state, zipcode 
having numrecs > 1; 

如何检查零个条目 - 一个state/zipcode组合没有行其flag = 'P'

回答

0

该查询应该给你违反你的准则的:?

SELECT STATE, ZIPCODE, SUM(FLAG_COUNTER) 
FROM (SELECT *, IF(FLAG='P', 1, 0) AS FLAG_COUNTER FROM addresses) tableWithCounter 
GROUP BY STATE, ZIPCODE 
HAVING SUM(FLAG_COUNTER) != 1 
+0

谢谢。我试过这个,但是我得到“每个派生表都必须有它自己的别名”。 – user3798040 2014-12-10 23:18:31

+0

是“MyTable”的别名吗?实际的表名(“地址”)去哪里? – user3798040 2014-12-10 23:20:16

+0

@ user3798040 MyTable是您实际表名称的占位符,因为我没有在原始文章中看到它。 'tableWithCounter'是派生表的别名,无关紧要。 – RobP 2014-12-10 23:21:28

1

你是在正确的轨道上,只是使用条件汇总:

SELECT state, zipcode, flag, count(*) as numrecs 
FROM addresses 
GROUP BY state, zipcode 
HAVING coalesce(sum(flag = 'P'), 0) <> 1 

或者,如果你喜欢:

HAVING coalesce(sum(flag = 'P'), 0) = 0 or sum(flag = 'P') > 1 

coalesce()需要,以防万一flag可以NULL和给定州/邮编组合只有NULL标志。

+0

不应该说,它是总和(合并(.. – wvdz 2014-12-10 23:13:48

+0

谢谢你,我认为这是工作 - 它告诉我0行返回,这是我所希望的:) – user3798040 2014-12-10 23:19:09

+0

故意创建一个约束被违反的条件,并测试它是否会被这个查询返回!(对于这个问题,我也要测试我的答案!我认为两者都应该工作,所以选择哪个更具可读性对于非常大的数据集,我不会感到惊讶,如果我的答案比较慢,因为它会创建一个临时表,但是可能不够慢,以致无法察觉。) – RobP 2014-12-10 23:22:17

相关问题