使用下面的查询(我是CTE的新手,所以这可能很乱),我想在我的数据库中构建所有最终类别的反向类别路径。
目前我在CTE本身内定义了一个ID(268707)。在我的最终主查询中有没有办法当我引用CTE时我可以提供变量?
我在查询中发表评论,我认为这是一个理想的地方,但是对于我的生活无法弄清楚如何。
WITH recursion(stocknode_id, short_desc, parentnode_id, level) AS
(
SELECT
stocknode_id,
short_desc,
parentnode_id,
0 AS level
FROM stock_website_node AS swn
WHERE swn.stocknode_id = 268707
UNION ALL
SELECT
swn.stocknode_id,
swn.short_desc,
swn.parentnode_id,
h.level + 1
FROM stock_website_node AS swn
INNER JOIN recursion AS h ON h.parentnode_id = swn.stocknode_id
)
SELECT
TOP 1 STUFF
(
(
SELECT ' / ' + swn_stuff.short_desc
FROM stock_website_node AS swn_stuff
WHERE swn_stuff.stocknode_id IN (SELECT stocknode_id FROM recursion) /* <--- I want to pass the variable from here, I think... */
FOR XML PATH(''), TYPE
).value('.','varchar(max)'),
1, 2, ''
) AS category_tree
FROM stock_website_node AS swn_a
如果我要做类似的事情(但似乎不起作用),我理想的是会产生结果的东西:
WITH recursion(stocknode_id, short_desc, parentnode_id, level) AS
(
SELECT
stocknode_id,
short_desc,
parentnode_id,
0 AS level
FROM stock_website_node AS swn
UNION ALL
SELECT
swn.stocknode_id,
swn.short_desc,
swn.parentnode_id,
h.level + 1
FROM stock_website_node AS swn
INNER JOIN recursion AS h ON h.parentnode_id = swn.stocknode_id
)
SELECT
TOP 1 STUFF
(
(
SELECT ' / ' + swn_stuff.short_desc
FROM stock_website_node AS swn_stuff
WHERE swn_stuff.stocknode_id IN (SELECT x.stocknode_id FROM recursion AS x WHERE x.xtocknode_id = swn_a.stocknode_id)
FOR XML PATH(''), TYPE
).value('.','varchar(max)'),
1, 2, ''
) AS category_tree
FROM stock_website_node AS swn_a
WHERE swn_a = 268707 OR swn_a = 268708 OR swn_a = 268709
我已经使用SQL创建了一个用于创建表变量的键盘,因此如果您想运行代码(http://codepad.org/4AaZEnlq),您可以准确地看到我在做什么。
该表包含类别,parentnode_id表示父类别的stocknode_id。 parentnode_id为0表示这是顶级类别。当前在CTE中提供的变量是底层类别,并且查询整体构建类别路径作为结果,例如:
顶级/第二级/第三级/第四级
在主查询期间,我想提供几个底层类别并返回每个类别的类别路径,但目前的限制是只能手动定义单个底层ID而不是动态提供几个,我是有点卡住了。
答案 0 :(得分:3)
用变量替换CTE中的常量值,并在执行查询之前为变量赋值。
您无法将值传递给您在代码中注释的CTE。必须在整个查询之前将值分配给变量。
declare @v int;
set @v = 268707;
with ....
(
select ...
where swn.stocknode_id = @v
union all
select ...
)
select ...
如果要指定多个stocknode_id,可以添加一个表变量来保存所需的值,并在查询中使用它,如下所示:
declare @T table(stocknode_id int);
insert into @T values(8), (12);
with R as
(
select C.stocknode_id,
cast(C.short_desc as varchar(max)) as short_desc,
C.parentnode_id
from @categories as C
where C.stocknode_id in (select T.stocknode_id from @T as T)
union all
select C.stocknode_id,
C.short_desc + ' / ' + R.short_desc,
C.parentnode_id
from @categories as C
inner join R
on C.stocknode_id = R.parentnode_id
)
select R.short_desc
from R
where R.parentnode_id = 0;