2013-05-03 442 views
1

我有一个位置表。每个位置都以树的形式存储在此表中。记录可以是任何其他位置的位置等。
在我的位置表,我执行下面的TSQL产生与他们sublocations
在SQL中使用UNION和WITH语句

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 insend UNIONUNION ALL返回重复的行。我想选择不同的行,例如只使用UNION时。

如何使用UNIONWITH SQL语句中的关键字?

+2

只是想知道..递归查询的一个不同名称,我的意思,而不是LocationTree,这也是您的表的名称? – bonsvr 2013-05-03 09:54:03

+0

@bonsvr你认为我的查询是错误的?我在网上找到了这个例子,所以我不太确定它。如果你看到任何错误,你能否告诉我纠正我的疑问? – Fer 2013-05-03 11:45:33

回答

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 

工作正常,我

+0

我不想让它离开选择。那就是为什么我坚持用WITH语句解决它 – Fer 2013-05-03 11:46:38

+0

我的db中没有表LocationTree。我将parentID和locationID存储在同一个名为Location的表中。 – Fer 2013-05-06 09:14:28

0

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

+0

我不想让它离开选择。那就是为什么我坚持用WITH语句解决它。 – Fer 2013-05-03 11:46:23