Sql 我使用多个查询来确定哪一组过滤器生成空表。有没有一种高效的方法可以通过一个查询来实现这一点?

Sql 我使用多个查询来确定哪一组过滤器生成空表。有没有一种高效的方法可以通过一个查询来实现这一点?,sql,tsql,Sql,Tsql,我所面临的问题的一个例子 假设我有一个FilterClause集合和一个底层表。我想找出这些过滤器中哪些完全过滤掉了整个表,哪些没有 我目前正在执行许多这样的SQL查询(每个filterClause一个查询) 是否有更好的方法将所有这些调用分组到一个查询中,并获得一个结果集,该结果集是FilterClause到是否过滤掉整个表的映射?我考虑过使用CASE语句和UNION语句的方法,但我想知道是否有更有效的方法 作为另一个问题(可选),对于没有生成空表的每个子句,我想检查有关结果表的某些内容(例如

我所面临的问题的一个例子

假设我有一个FilterClause集合和一个底层表。我想找出这些过滤器中哪些完全过滤掉了整个表,哪些没有

我目前正在执行许多这样的SQL查询(每个filterClause一个查询)

是否有更好的方法将所有这些调用分组到一个查询中,并获得一个结果集,该结果集是FilterClause到是否过滤掉整个表的映射?我考虑过使用CASE语句和UNION语句的方法,但我想知道是否有更有效的方法

作为另一个问题(可选),对于没有生成空表的每个子句,我想检查有关结果表的某些内容(例如,某个列是否具有严格的正值,或者是否所有列的所有行都不为空)。使用单查询每筛选器子句方法,我可以对单独筛选的表执行这些检查。对于如何在批处理级别执行这些检查,有什么建议吗


提前谢谢

至于检查过滤器的效果:将表的总行数与匹配条件的行数进行比较:

select
  count(*) as totalcount,
  count(case when {filterClause1} then 1 end) as filter1count,
  count(case when {filterClause2} then 1 end) as filter2count,
  ...
from table;

至于在一批中进一步缩小范围:目前还不清楚。对不起。

我不确定我是否明白你的意思,但我认为你需要的是:

SELECT CASE WHEN NOT EXISTS
(SELECT * FROM table
WHERE {filterClause1})
THEN 1 ELSE 0 END as filterLabel1,
CASE WHEN NOT EXISTS
(SELECT * FROM table
WHERE {filterClause2})
THEN 1 ELSE 0 END as filterLabel2,...
这应该为您提供一个条件为真和为假的映射,如果您想验证更多条件,如果一个条件为真,我只有一个想法,并且它只允许您添加一个验证:

SELECT CASE WHEN NOT EXISTS
(SELECT * FROM table
WHERE {filterClause1})
THEN 
    (
      Select CASE WHEN
      {subFilterClause}
      THEN 1 ELSE 0 END
    )
ELSE 0 END as filterLabel1
显然,我不建议深入到这一步,最好在SQL端或应用程序端有一个过程来为您完成它

SELECT CASE WHEN NOT EXISTS
(SELECT * FROM table
WHERE {filterClause1})
THEN 
    (
      Select CASE WHEN
      {subFilterClause}
      THEN 1 ELSE 0 END
    )
ELSE 0 END as filterLabel1