#sql #sql-server #sql-server-2008
#sql #sql-сервер #sql-server-2008
Вопрос:
У меня есть эти 2 запроса, которые возвращают один и тот же результат:
;WITH reta
AS (SELECT *
FROM TEST r
WHERE Group_ID = 2
UNION ALL
SELECT t.*
FROM TEST t
INNER JOIN reta r ON t.Parent_ID = r.Group_ID)
SELECT *
FROM reta order by 1;
И
SELECT *
FROM TEST t
LEFT OUTER JOIN TEST t1 ON t.Parent_ID = t1.Group_ID
WHERE t.Group_ID >= 2
ORDER BY 1
Но если я изменил group_ID с 2 на 3, он возвращает другой результат. Мой приведенный выше запрос возвращает 2 строки, но мой 2-й запрос возвращает 103 строки. Мне сложно сопоставить выходные данные обоих запросов.
Комментарии:
1. Вы не можете воспроизвести функциональность рекурсивного выражения общей таблицы, просто используя
LEFT OUTER JOIN
. У вас есть иерархические данные, и наиболее распространенный способ получить набор данных из этого типа данных — использовать rCTE.2. Итак, мы никак не можем избежать рекурсивного CTE для получения иерархических данных?
3. Вы могли бы взглянуть на статьи Джеффа Модена «Иерархии на стероидах» ( # 1 amp; # 2 ), однако они создадут статическую версию ваших данных; поэтому, если у вас постоянно изменяющиеся данные, они могут быть не идеальными.
4. @RedDevil . . . Вы можете использовать
while
цикл в хранимой процедуре или функции.