【问题标题】:Return alternate view results if first select returns 0 count如果第一次选择返回 0 计数,则返回备用视图结果
【发布时间】:2017-03-16 16:44:15
【问题描述】:

我在 SQL Server 视图中有相当长的 SQL 选择。

但是,我想要一个条件,这样如果没有返回任何行,那么它会更改 where 子句。

查询概览如下:

SELECT COL1, COL2, COL3, COL4............(15 columns)
FROM TABLE1 inner join TABLE2 ON t1 = t2 (10 tables)
WHERE a = b

所以我想要的是,如果上面的查询返回 0 行,那么返回结果:

SELECT COL1, COL2, COL3, COL4............(15 columns)
FROM TABLE1 inner join TABLE2 ON t1 = t2 (10 tables)
WHERE a = c

我怎样才能在视图中解决这个问题?

提前致谢

【问题讨论】:

  • 您可以使用or 条件.. WHERE a = b or a = c
  • 但如果 a = b 有值,我不想返回 a = c

标签: sql sql-server view


【解决方案1】:

使用common table expressionnot exists()

;with cte as (
  /* big query here without where clause of `a = b` or `a = c` */
)
select * 
from cte
where a = b
  or ( a = c
    and not exists (select 1 from cte where a = b)
      )

示例:

create table t (value int);
insert t values (0),(1),(3),(4),(5);
with cte as (
  select *
  from t
)
select * 
from cte
where value = 2
  or ( value = 3 
    and not exists (select 1 from cte where value=2)
      )

返回3

rextester 演示:http://rextester.com/NDC30620

【讨论】:

  • 这种方法看起来应该可行。 CTE 是否会对性能造成很大影响或有什么影响?
  • @DaRoGa cte 本身没有性能损失,正如这里使用的那样,它仅用于通过不重复 not exists() 中的主查询来保持查询 DRY。这将取决于查询本身的性能。使用带有递归的 cte 可能会导致性能下降,但此处并非如此。
【解决方案2】:

选择这两个集合并使用RANK 将具有a = b 的集合优先于具有a = c 的集合:

SELECT COL1, COL2, COL3, COL4............(15 columns)
FROM (
   SELECT RANK() OVER (ORDER BY CASE 
                                   WHEN a = b THEN 1
                                   ELSE 2
                                END) AS rnk,
          COL1, COL2, COL3, COL4............(15 columns)
   FROM TABLE1 inner join TABLE2 ON t1 = t2 (10 tables)
   WHERE a IN (b, c)) AS t
WHERE t.rnk = 1

如果确实存在某些具有a = b 的记录,则查询将准确选择这些记录,否则它将返回具有a = c 的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2018-08-11
    • 2021-06-26
    • 2011-10-27
    • 2016-07-31
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多