2012-11-09 56 views
0

我有一個包含以下列(id,fkid,flag1,flag2,flag3,flag4)的表。每個標誌字段的可能值是-1到3,並且允許null。我需要的是一個查詢來檢查給定的外鍵fkid的值爲2的任何標誌字段的計數是否大於3。我正在做的是寫每個字段的查詢。它有效,但對我來說不是很聰明。任何人有更好的主意?謝謝。對於複雜情況的最佳查詢

+2

它看起來像你的數據庫沒有正確歸,也是其很難幫助這麼少的信息,您能不能告訴我們表創建以及您正在使用的查詢? –

+0

是不是所有的「[value] 2 [is]大於3」都是false? (顯示當前的嘗試會使問題更加清晰,發佈執行時間,查詢計劃和模式對於「性能」問題至關重要。) – 2012-11-09 20:39:00

回答

1

你可以用一個查詢做到這一點:

select fkid 
from t 
group by fkid 
having sum(case when flag1 = 2 then 1 else 0 end) > 3 or 
     sum(case when flag2 = 2 then 1 else 0 end) > 3 or 
     sum(case when flag3 = 2 then 1 else 0 end) > 3 or 
     sum(case when flag4 = 2 then 1 else 0 end) > 3 

我與評論非常同意,雖然,樣本數據,抽樣結果,以及清晰的表結構將大大改善這個問題。

+0

謝謝Gordon。這正是我所尋找的。 –

1

查詢下面也將回答你的問題,SQL小提琴例如:http://sqlfiddle.com/#!3/adda9/2

SELECT 
    DISTINCT fkid 
FROM 
    tblTest pvt 
UNPIVOT 
    (
    FlagValue FOR Flag IN 
     (flag1,flag2,flag3,flag4) 
) as Unpvt 
WHERE 
    FlagValue = 2 
GROUP BY 
    FKID, FLAG 
HAVING COUNT(*)>3 
+0

謝謝。這是檢查大量列的更清晰的方法。 –