использование UNION вместе с оператором WITH в SQL

У меня есть таблица местоположений. Каждое местоположение хранится в этой таблице в виде дерева. Записи могут быть частью любого другого местоположения и так далее.
В моей таблице местоположений я выполняю следующую команду 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.

Как я могу использовать ключевое слово UNION в операторе WITH в SQL?


person Fer    schedule 03.05.2013    source источник
comment
просто интересно... как насчет другого имени для рекурсивного запроса, я имею в виду вместо LocationTree, которое также является именем вашей таблицы?   -  person bonsvr    schedule 03.05.2013
comment
@bonsvr Вы думаете, что мой запрос неправильный? Я нашел этот пример в сети, поэтому я не уверен в этом. Если вы видите какую-либо ошибку, не могли бы вы сказать мне, чтобы исправить мой запрос?   -  person Fer    schedule 03.05.2013


Ответы (2)


Добавьте UNION ALL вместо UNION и SELECT DISTINCT * FROM LocationTree во внешний выбор.

person TechDo    schedule 03.05.2013
comment
Я не хочу оставлять это для внешнего выбора. Вот почему я настаиваю на решении этого в операторе WITH. - person Fer; 03.05.2013

Проблема в том, что ваш 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

отлично работает для меня

person paul    schedule 03.05.2013
comment
Я не хочу оставлять это для внешнего выбора. Вот почему я настаиваю на решении этого в операторе WITH - person Fer; 03.05.2013
comment
В моей БД нет таблицы LocationTree. Я храню parentID и locationID в одной таблице с именем Location. - person Fer; 06.05.2013