我创建了一个参与CTE
的,没有递归,但是在处理需求的业务逻辑时进行了多项选择。不过,我被告知,没有返回行的场景所需的逻辑应该返回从中间CTE
的 select 之一找到的所有行,而不是返回最终操作。
如何实现?
请注意,以下示例是对我的流程的基本解释,并且在多个级联 CTE 选择基本上链接在一起之后发生了相关操作。
示例(在SQLFiddle上找到)
在用户表中有两条记录,其中UserId
s 的 id 是1
和2
。第一个CTE
s select,TargetUsers
将不返回需要第三个 CTEComputeWithUsers
来使用 the 的行AllUsers
。
WITH TargetUsers AS
(
SELECT *
FROM Users
WHERE UserId > 5
)
, AllUsers AS
(
SELECT * FROM Users
)
, ComputeWithUsers
(
-- This CTE will determine it needs to use `AllUsers` and not `TargetUsers`
)
或者有没有办法让TargetUsers
选择足够聪明,以便在其主要操作不返回任何行时提取所有用户?
这是我这样做的方式,假设“在一个查询中完成所有操作”不仅仅是一个毫无意义的人为要求。
如果“在一个查询中完成所有操作”是一项硬性要求,并且您不能使用 #temp 表,或者您确实有复杂的逻辑,您已经从我们这里简化了和/或不想重复,那么您恐怕要为这些选择付出代价。这看起来应该非常有效,但是对基表的命中率将比大多数人希望/期望的要多:
实际上,如果 UserID 是主键并且过滤器确实在 UserID 上,则如下所示可能会更好(但您必须检查计划才能看到,这取决于多种因素):
希望您的查询由于简化而使用次优实践,而不是像生产中那样,但请阅读以下内容:
假设性能可以接受,您可以使用以下方法在初始过滤器未能返回任何结果时获取所有用户。
您只是设置了一个人为的 OR,如果基本选择不返回任何内容,它将允许所有记录通过过滤器。