powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как использовать результаты вложенного рекурсивного подзапроса?
6 сообщений из 6, страница 1 из 1
Как использовать результаты вложенного рекурсивного подзапроса?
    #39675511
AndrewAtLipetsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги.
Пока не было рекурсий, было всё просто:
Код: sql
1.
select * from таблица where таблица.id in (select id from таблица where условие)


Всё работало, вложенный запрос возвращал перечень идентификаторов, удовлетворяющих условию отбора, после чего внешний запрос выдавал результат. Я сейчас не об оптимизации приведенного мною запроса - понятно что тут не нужен вложенный запрос в приниципе... Я о самой схеме in.

Теперь с рекурсией, хочется использовать ту же схему. Но она не работает. Отдельно запрос с рекурсией возвращает всё как положено, если же его обвести в скобки, и указать как указано ниже - MS Sql manager studio выдаст ошибку.

Код: sql
1.
2.
3.
4.
5.
6.
select * from Subdivisions where id in ( 
 WITH tree (id , name, idParent) 
 AS ( SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t WHERE t.ID = 1 UNION ALL 
 SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t INNER JOIN tree ON ( t.Id_parent = tree.id )) 
 SELECT tr.id FROM tree tr order by tr.id
 )


текст ошибки
Сообщение 156, уровень 15, состояние 1, строка 3
Incorrect syntax near the keyword 'WITH'.
Сообщение 319, уровень 15, состояние 1, строка 3
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Сообщение 102, уровень 15, состояние 1, строка 7
Incorrect syntax near ')'.


Собственно вопрос -я хочу в рекурсии выбрать все элементы на разных уровнях дерева, удовлетворяющие условию. А в основном запросе, должен выдать только их. (where id in (*) )
Какие тут есть варианты?
...
Рейтинг: 0 / 0
Как использовать результаты вложенного рекурсивного подзапроса?
    #39675512
Guf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewAtLipetsk,

Код: sql
1.
2.
3.
4.
 WITH tree (id , name, idParent) 
 AS ( SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t WHERE t.ID = 1 UNION ALL 
 SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t INNER JOIN tree ON ( t.Id_parent = tree.id )) 
select * from Subdivisions where id in (SELECT tr.id FROM tree tr order by tr.id)
...
Рейтинг: 0 / 0
Как использовать результаты вложенного рекурсивного подзапроса?
    #39675515
AndrewAtLipetsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо
...
Рейтинг: 0 / 0
Как использовать результаты вложенного рекурсивного подзапроса?
    #39675522
AndrewAtLipetsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как сделать в таком случае 2 рекурсивных подзапроса?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 WITH tree (id , name, idParent) 
 AS ( SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t WHERE t.ID = 1 UNION ALL 
 SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t INNER JOIN tree ON ( t.Id_parent = tree.id )) 

 WITH tree2 (id , name, idParent) 
 AS ( SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t WHERE t.ID = 1 UNION ALL 
 SELECT t.ID, t.NAME, t.Id_parent FROM Subdivisions t INNER JOIN tree2 ON ( t.Id_parent = tree2.id )) 

 SELECT tr.id FROM tree tr order by tr.id



На второй with начинает ругаться...
...
Рейтинг: 0 / 0
Как использовать результаты вложенного рекурсивного подзапроса?
    #39675526
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewAtLipetsk,

а вы принципиало хелп не открываете? Гордость или какие фобии?
...
Рейтинг: 0 / 0
Как использовать результаты вложенного рекурсивного подзапроса?
    #39675537
AndrewAtLipetsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо что именно в хелп ткнули носом, а не куда то еще :) нашел там, вопрос закрыт.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH Sales_CTE (SalesPersonID, TotalSales, SalesYear)  
AS  
-- Define the first CTE query.  
(  
    SELECT SalesPersonID, SUM(TotalDue) AS TotalSales, YEAR(OrderDate) AS SalesYear  
    FROM Sales.SalesOrderHeader  
    WHERE SalesPersonID IS NOT NULL  
       GROUP BY SalesPersonID, YEAR(OrderDate)  

)  
,   -- Use a comma to separate multiple CTE definitions.  

-- Define the second CTE query, which returns sales quota data by year for each sales person.  
Sales_Quota_CTE (BusinessEntityID, SalesQuota, SalesQuotaYear)  
AS  
(  
       SELECT BusinessEntityID, SUM(SalesQuota)AS SalesQuota, YEAR(QuotaDate) AS SalesQuotaYear  
       FROM Sales.SalesPersonQuotaHistory  
       GROUP BY BusinessEntityID, YEAR(QuotaDate)  
)  

-- Define the outer query by referencing columns from both CTEs.  
SELECT SalesPersonID 
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как использовать результаты вложенного рекурсивного подзапроса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]