sql - SQL Server 2012 - 在 WHERE 子句下具有两个条件的递归 CTE
问题描述
#1 编辑
我将 WHERE 子句中的 AND 更改为 OR,一切正常。但是我需要在 CTE 的递归部分使用 JOIN,问题又出现了,因为我不能在这里使用 OUTER JOIN。因此,我将 JOIN 更改为 OUTER APPLY 并且效果很好。
SQL 小提琴:http ://sqlfiddle.com/#!18/9eecb/81809
我正在尝试实现一个递归 CTE,它接收两个年龄并递增这些年龄,直到它们都等于 120。问题是当我尝试将 WHERE 子句添加到递归部分时,谓词被完全忽略:
;with age_cte as (
select
26 as wife_age,
28 as husband_age
union all
select
age_cte.wife_age + 1,
age_cte.husband_age + 1
from age_cte
where wife_age < 120 and husband_age < 120
) select * from age_cte;
一旦其中一个年龄达到 120,CTE 就会停止。在这个例子中,当丈夫年龄等于 120 时,妻子的年龄是 118,然后计算停止。
我知道数据库遵循查询的逻辑。我的问题是我应该怎么做才能将正确的逻辑应用于该 CTE,即当一个年龄超过 120 直到另一个年龄达到 120 时返回 NULL?
Example:
. .
. .
. .
118 120
119 NULL
120 NULL
我尝试使用具有两个锚点和两个递归部分的 CTE,如下面的文档示例(“H. Using multiple anchor and recursive members”):
create table age (
wife_age int,
husband_age int
);
insert into age values(26, 28);
;with age_cte as (
-- first anchor
select
wife_age
from age
union
-- second anchor
select
husband_age
from age
union all
select
age_cte.wife_age + 1
from age_cte
where wife_age < 120
union all
--
select
age_cte.husband_age + 1
from age_cte
where husband_age < 120
) select * from age_cte;
我遗漏了一些东西,因为它在第二个递归查询中为“husband_age”提供了“无效的列名”。
我也试过这个查询
;with age_cte as (
select
26 as wife_age,
28 as husband_age
union all
select
case when age_cte.wife_age + 1 > 120 then null else age_cte.wife_age + 1 end,
case when age_cte.husband_age + 1 > 120 then null else age_cte.husband_age + 1 end
from age_cte
where 120 >= case
when age_cte.wife_age + 1 < age_cte.husband_age + 1 then
age_cte.wife_age + 1
else
age_cte.husband_age + 1
end
) select * from age_cte;
但要么它给出一个无限循环,要么年龄达到 119 永远不会达到 120。
解决方案
这应该做你想要的:
with age_cte as (
select 26 as wife_age, 28 as husband_age
union all
select
case when wife_age < 120 then wife_age + 1 end,
case when husband_age < 120 then husband_age + 1 end
from age_cte
where wife_age < 120 or husband_age < 120
)
select * from age_cte;
那是:
你想
or
在where
递归查询的子句中而不是and
,所以查询会一直持续到两个年龄都达到 120您可以在年龄超过 120 岁时使用条件逻辑
select
来生成snull
妻子年龄 | 丈夫年龄 --------: | ----------: 26 | 28 27 | 29 28 | 30 29 | 31 ... 116 | 118 117 | 119 118 | 120 119 | 空 120 | 无效的
推荐阅读
- ios - 滚动后如何获取 UIScrollView 的 CGRect?
- r - 使用 r 有条件地填充新添加的列
- c# - 视图模型的跨平台继承
- jquery - 滚动页面到滚动 jquery 上的 div
- html - 样式颜色/日期输入窗口
- sql - 解析函数:ROW_NUMBER( )
- php - 在 CLI 中启用了扩展但在 PHPinfo 中未启用
- javascript - 为什么 Google Hangouts 支持在最新的 Chrome 中不使用 Chrome 扩展程序共享桌面?
- html - 如何使用 django 小部件调整并结合模板类字符串和小部件属性字符串名称
- django - Django内联表单集多个模型