Замена рекурсивного запроса в sql Server

#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 цикл в хранимой процедуре или функции.