SQL:查找哪个子句使我的查询无法回答

时间:2017-11-27 10:59:46

标签: sql sql-server

我的查询是基本的,如下所示:

SELECT ID FROM Table WHERE CRIT1='a' AND CRIT2='b' AND CRIT3='c'

然而,它有时没有返回任何价值。这是正常的,因为表中没有匹配项。

为了帮助我的用户找到哪些标准限制太多,我想找到另一个查询,告诉我是否因为CRIT1,CRIT2或CRIT3这个条款我没有答案。

目前,我已经这样做了(使用伪代码):

If ( SELECT ID FROM Table WHERE CRIT1='a'  returns EOF ) 

   Then WrongCriteria="CRIT1" 

Elseif ( SELECT ID FROM Table WHERE CRIT1='a' AND CRIT2='b' returns EOF )

    Then WrongCriteria="CRIT2"

Elseif ( SELECT ID FROM Table WHERE CRIT1='a' AND CRIT2='b' AND CRIT3='c'  returns EOF ) 

  Then WrongCriteria="CRIT3"

它有效...但是有几个查询,由于网络响应时间不长,每个查询都很慢。

我的问题是:可以在一个SQL查询中执行上述伪代码吗?

2 个答案:

答案 0 :(得分:3)

您可以在条件:{/ p>上使用SUM将三个查询合并为一个

SELECT
    SUM(CASE WHEN CRIT1='a' THEN 1 ELSE 0 END) as CRIT1
,   SUM(CASE WHEN CRIT1='a' AND CRIT2='b' THEN 1 ELSE 0 END) as CRIT2
,   SUM(CASE WHEN CRIT1='a' AND CRIT2='b' AND CRIT3='c' THEN 1 ELSE 0 END) as CRIT3
FROM MyTable

列中的零对应于限制性标准。

请注意,这只是您的三个查询的不同实现,其中"优先级排序"以特定方式的标准(crit1然后crit2然后crit3)。从理论上讲,你想要测试所有个体的三个标准,加上三个对的组合,即得到这些条件的六个计数:

  • CRIT1='a'
  • CRIT2='b'
  • CRIT3='c'
  • CRIT1='a' && CRIT2='b'
  • CRIT1='a' && CRIT3='c'
  • CRIT2='b' && CRIT3='c'

以上六项计数可以让您全面了解哪些标准过于严格。

答案 1 :(得分:2)

是的,可以使用“ OR ”运算符在单个查询中执行此检查。 我假设它只是一个条件,一次可能出错:

SELECT CASE WHEN CRIT1 <> 'a' THEN 'CRIT1'
            WHEN CRIT2 <> 'b' THEN 'CRIT2'
            WHEN CRIT3 <> 'c' THEN 'CRIT3' END AS WrongCriteria
FROM Table WHERE CRIT1<>'a' OR CRIT2<>'b' OR CRIT3<>'c'