2014-12-10 85 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

相關問題