在SQL中使用UNION和WITH语句

时间:2013-05-03 09:42:55

标签: sql recursive-query

我有一张位置表。每个位置都以树的形式存储在此表中。记录可以是任何其他位置的子位置,依此类推。
在我的位置表中,我执行以下tsql以生成具有子位置的所有位置

WITH LocationTree AS (
    SELECT L.* FROM Location L
                UNION
    SELECT L.* FROM LocationTree LT, Location L where L.ParentLocationID = LT.LocationID
        )

SELECT * FROM LocationTree

但它给了我一个错误:

Recursive common table expression 'LocationTree' does not contain a top-level UNION ALL operator.

错误说我必须使用 UNION ALL UNION ,但 UNION ALL 会返回重复的行。我想选择不同的行,就像仅使用UNION一样。

如何在SQL中的 WITH 语句中使用 UNION 关键字?

2 个答案:

答案 0 :(得分:0)

问题是因为你的CTE被命名为与你的一个表相同:

WITH LT AS (
    SELECT L.* FROM Location L
                UNION
    SELECT L.* FROM LocationTree LT, Location L where L.ParentLocationID = LT.LocationID
        )
SELECT * FROM LT

对我来说很好用

答案 1 :(得分:0)

在外部选择中添加UNION ALL而不是UNIONSELECT DISTINCT * FROM LocationTree