(公用表表达式)CTE作为WHERE子句的一部分......可能吗?

时间:2010-07-01 00:13:00

标签: sql sql-server tsql

是否可以在WHERE子句中使用CTE,例如

SELECT * 
  FROM Table1 
 WHERE Table1.PK IN (
   WITH Cte AS (
    -- root selection (dynamic, generated in code)
    SELECT Bla FROM Table2
    -- recursive part
    UNION ALL
    SELECT …..)
  SELECT Bla FROM Cte)

我问的原因是我需要使用递归查询,而且在不更新框架的情况下执行此操作的唯一方法是将其放在where子句中。

2 个答案:

答案 0 :(得分:3)

不,需要在主SELECT之前定义WITH子句。像这样:

WITH recursive_cte AS (
   -- root selection (dynamic, generated in code)
   SELECT Bla FROM Table2
   -- recursive part
   UNION ALL
   SELECT …..)
SELECT t.*
  FROM TABLE1 t
  JOIN recursive_cte rc ON rc.key = t.pk

我还调整了查询​​以使用JOIN,但你必须注意重复。

答案 1 :(得分:0)

是的,您可以在CTE中应用WHERE CLAUSE。您必须创建表值函数并在表中返回结果。 然后,您可以在任何带有WHERE子句的查询中使用此结果集。 转到链接并找到示例:
 http://muhammadnaveed.info/use-cte-query-in-where-clause/ 希望这会对你有所帮助。