gpt4 book ai didi

sql - T-SQL : multiple usage of CTE alias - not only in outer query

转载 作者:行者123 更新时间:2023-12-02 08:38:20 24 4
gpt4 key购买 nike

我在一个脚本中使用WITH子句时出现了一个问题。这个问题很容易指出,我想多次使用 CTE 别名,而不是仅在外部查询中使用,这就是症结所在。

例如:

-- Define the CTE expression
WITH cte_test (domain1, domain2, [...])
AS
-- CTE query
(
SELECT domain1, domain2, [...]
FROM table
)
-- Outer query
SELECT * FROM cte_test
-- Now I wanna use the CTE expression another time
INSERT INTO sometable ([...]) SELECT [...] FROM cte_test

最后一行将导致以下错误,因为它位于外部查询之外:

Msg 208, Level 16, State 1, Line 12 Invalid object name 'cte_test'.

有没有办法多次使用 CTE?让它持久?我当前的解决方案是创建一个临时表,在其中存储 CTE 的结果,并使用该临时表进行任何进一步的语句。

-- CTE
[...]
-- Create a temp table after the CTE block
DECLARE @tmp TABLE (domain1 DATATYPE, domain2 DATATYPE, [...])
INSERT INTO @tmp (domain1, domain2, [...]) SELECT domain1, domain2, [...] FROM cte_test
-- Any further DML statements
SELECT * FROM @tmp
INSERT INTO sometable ([...]) SELECT [...] FROM @tmp
[...]

坦白说,我不喜欢这个解决方案。其他人有解决此问题的最佳实践吗?

提前致谢!

最佳答案

CommonTableExpression 不以任何方式保留数据。它基本上只是在主查询本身之前创建子查询的一种方法。

这使得它比普通子查询更像内联 View 。因为您可以在一个查询中重复引用它,而不必一次又一次地键入它。

但它仍然只是被视为一个 View ,扩展为引用它的查询,就像宏一样。根本没有数据持久化。


不幸的是,这意味着您必须自己坚持下去。

  • 如果您希望 CTE 的逻辑得以保留,您不需要内联 View ,而只需要一个 View 。

  • 如果您希望持久保存 CTE 的结果集,则需要一种临时表类型的解决方案,例如您不喜欢的解决方案。

关于sql - T-SQL : multiple usage of CTE alias - not only in outer query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10849694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com