在SQL中结合使用UNION和with语句

在SQL中结合使用UNION和with语句,sql,recursive-query,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 ) SELE

我有一张位置表。此表中存储为树的每个位置。记录可以是任何其他位置的子位置,等等
在我的位置表中,我执行以下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关键字?

问题是因为您的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

对我来说很好

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

只是想知道..递归查询的另一个名称如何,我的意思是代替LocationTree,这也是表的名称?@bonsvr你认为我的查询错了吗?我在网上找到了这个例子,所以我不太确定。如果你看到任何错误,你能告诉我更正我的查询吗?我不想把它留给外部选择。这就是为什么我坚持用语句来解决它。我不想把它留给外部选择。这就是为什么我坚持用语句解决它,因为我的数据库中没有表位置树。我将parentID和locationID存储在同一个名为Location的表中。