对复杂情况的最佳查询

时间:2012-11-09 20:26:53

标签: sql database

我有一个包含以下列的表,(id,fkid,flag1,flag2,flag3,flag4)。每个标志字段的可能值为-1到3,并且允许为null。我需要的是一个查询来检查给定外键fkid的值为2的任何标志字段的计数是否大于3。我正在做的是为每个字段写一个查询。它有效但对我来说并不聪明。谁有更好的主意?感谢。

2 个答案:

答案 0 :(得分: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

我同意这些意见,但样本数据,样本结果和清晰的表格结构将大大改善这个问题。

答案 1 :(得分:1)

下面的查询也会回答你的问题,例如: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