Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Доброго времени суток!

есть следующий рекурсивный запрос:

with Rectab (SOURCECI,TARGETCI) as (select SOURCECI, TARGETCI from cirelation where TARGETCI ='SW08100000229'
union all
select Rectab.TARGETCI, cr2.SOURCECI from Rectab,cirelation cr2
where Rectab.SOURCECI=cr2.TARGETCI)
select distinct rectab.SOURCECI from Rectab where rectab.SOURCECI in (select CINUM from ci where CLASSSTRUCTUREID = '1157' )

Запрос к таблице с деревом представленном в виде: SOURCECI(потомок), TARGETCI(родитель)

Сам запрос работает и выводит необходимых потомков, но есть потребность применить к нему еще один select * from .... where .... in ( тут наш рекурсивный запрос)

Синтаксис такого не позволяет, выдает ошибку:"Обнаружен неправильный элемент "as" после текста "(SOURCECI,TARGETCI)"

Как решить данную проблему? Select в начале нужен для поиска полученного множества результатов в другой таблице и он обязательно должен быть в начале.

Надеюсь все достаточно понятно разъяснил, заранее спасибо.
17 июн 14, 12:44    [16175153]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
fat32al1ty
Доброго времени суток!

есть следующий рекурсивный запрос:

with Rectab (SOURCECI,TARGETCI) as (select SOURCECI, TARGETCI from cirelation where TARGETCI ='SW08100000229'
union all
select Rectab.TARGETCI, cr2.SOURCECI from Rectab,cirelation cr2
where Rectab.SOURCECI=cr2.TARGETCI)
select distinct rectab.SOURCECI from Rectab where rectab.SOURCECI in (select CINUM from ci where CLASSSTRUCTUREID = '1157' )

Запрос к таблице с деревом представленном в виде: SOURCECI(потомок), TARGETCI(родитель)

Сам запрос работает и выводит необходимых потомков, но есть потребность применить к нему еще один select * from .... where .... in ( тут наш рекурсивный запрос)

Синтаксис такого не позволяет, выдает ошибку:"Обнаружен неправильный элемент "as" после текста "(SOURCECI,TARGETCI)"

Как решить данную проблему? Select в начале нужен для поиска полученного множества результатов в другой таблице и он обязательно должен быть в начале.

Надеюсь все достаточно понятно разъяснил, заранее спасибо.


Отформатируйте ваш запрос, чтобы читабельно было. Если взять рекурсивный запрос, то в любом из SELECT можно поставить нужное вам WHERE . Вот мой пример

WITH nm AS 
-- рекурсное построение дерева номенклатуры 
(
	SELECT [nm_id]
		  ,[nm_id_parent] = NULL
		  ,[nm_code]
		  ,[nomenclature_Name]
		  ,[nm_parent_code]
		  ,[Resp_Code]
		  ,[id_Responsible]
		  ,[Resp_name]
		  ,[Senior_Name]
		  ,[Senior_Code]
		  ,[id_Senior]
		  ,[nm_parent_name]
		  ,[Article]
		  ,[IsFolder]
		  ,[deleted]
		  ,coord_Code
		  ,coord_Name
		  ,L = 0
	  FROM [Dictionary].[vw_Nomenclature_1C_2] nm0 
	  WHERE [nm_parent_code] IS NULL -- корневой уровень

	  UNION ALL 

	SELECT nm1.[nm_id]
		  ,nm_id_parent = nm.[nm_id]
		  ,nm1.[nm_code]
		  ,nm1.[nomenclature_Name]
		  ,nm1.[nm_parent_code]
		  ,[Resp_Code] = ISNULL(nm1.[Resp_Code], nm.[Resp_Code])
		  ,[Resp_Code] = ISNULL(nm1.[id_Responsible], nm.[id_Responsible])
		  ,[Resp_name] = ISNULL(nm1.[Resp_name], nm.[Resp_name])
		  ,[Senior_Name] = ISNULL(nm1.[Senior_Name], nm.[Senior_Name])
		  ,[Senior_Code] = ISNULL(nm1.[Senior_Code], nm.[Senior_Code])
		  ,[id_Senior] = ISNULL(nm1.[id_Senior], nm.[id_Senior])
		  ,[nm_parent_name] = ISNULL(nm1.[nm_parent_name], nm.[nm_parent_name])
		  ,nm1.[Article]
		  ,nm1.[IsFolder]
		  ,nm1.[deleted]
		  ,coord_Code = ISNULL(nm1.coord_Code, nm.coord_Code)
		  ,coord_Name = ISNULL(nm1.coord_Name, nm.coord_Name)
		  ,L = nm.L + 1
	  FROM [Dictionary].[vw_Nomenclature_1C_2] nm1
	  INNER JOIN nm ON nm1.[nm_parent_code] = nm.[nm_code] -- рекурсивный JOIN
)
SELECT 
	   [nm_id]
      ,[nm_id_parent]
      ,[nm_code]
      ,[nomenclature_Name]
      ,[nm_parent_code]
      ,[Resp_Code]
      ,[id_Responsible]
      ,[Resp_name]
      ,[Senior_Name]
      ,[Senior_Code]
      ,[id_Senior]
	  ,[id_Responsible_id_Senior] = [id_Responsible] * CAST(1000000000 AS BIGINT) + [id_Senior]
      ,[nm_parent_name]
      ,[Article]
      ,[IsFolder]
      ,[deleted]
	  ,coord_Code = ISNULL(coord_Code, -1)
	  ,coord_Name = ISNULL(coord_Name, 'Неизвестный')
      ,[L]
FROM nm 
17 июн 14, 12:50    [16175216]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
aleks2
Guest
fat32al1ty
Надеюсь все достаточно понятно разъяснил, заранее спасибо.

И не надейся. Я вот ничо не понял.
Лучше бы нарисовал запрос, который "выдает ошибку:"Обнаружен неправильный элемент "as" после текста "(SOURCECI,TARGETCI)".

Ибо бред словами то бред написан.
17 июн 14, 12:51    [16175226]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fat32al1ty
но есть потребность применить к нему еще один select * from .... where .... in ( тут наш рекурсивный запрос)

А вы умеете писать join-ы вместо in ?

;with Rectab (SOURCECI,TARGETCI) as (select SOURCECI, TARGETCI from cirelation where TARGETCI ='SW08100000229'
union all
select Rectab.TARGETCI, cr2.SOURCECI from Rectab,cirelation cr2
where Rectab.SOURCECI=cr2.TARGETCI)

select * from Rectab join ..... where rectab.SOURCECI in (select CINUM from ci where CLASSSTRUCTUREID = '1157' )
17 июн 14, 12:54    [16175257]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
select * from maximo.ci where cinum in (
with Rectab (SOURCECI,TARGETCI) as (select SOURCECI, TARGETCI from maximo.cirelation where TARGETCI ='SW08100000229'
union all
select Rectab.TARGETCI, cr2.SOURCECI from Rectab, maximo.cirelation cr2
where Rectab.SOURCECI=cr2.TARGETCI)
select distinct rectab.SOURCECI from Rectab where rectab.SOURCECI in (select CINUM from maximo.ci where CLASSSTRUCTUREID = '1157' )
)


Ошибка:
Обнаружен неправильный элемент "as" после текста "(SOURCECI,TARGETCI)". Список возможных правильных элементов: "JOIN".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.62.56


Elapsed Time: 0 hr, 0 min, 0 sec, 0 ms.
17 июн 14, 12:58    [16175288]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Glory,

Вопрос в другом, нужен select в начале.
17 июн 14, 12:59    [16175304]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Добрый Э - Эх
Guest
fat32al1ty,


with Rectab (SOURCECI,TARGETCI) as (select SOURCECI, TARGETCI from maximo.cirelation where TARGETCI ='SW08100000229'
union all
select Rectab.TARGETCI, cr2.SOURCECI from Rectab, maximo.cirelation cr2
where Rectab.SOURCECI=cr2.TARGETCI),
x_q as (select distinct rectab.SOURCECI from Rectab where rectab.SOURCECI in (select CINUM from maximo.ci where CLASSSTRUCTUREID = '1157' ))
select * from maximo.ci where cinum in (select * from x_q)
17 июн 14, 13:01    [16175327]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fat32al1ty
Вопрос в другом, нужен select в начале.

Тот, кому нужен, должен почитать про синтасис и понизить планку своих желаний до реалий.
17 июн 14, 13:01    [16175332]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Glory,

Должен быть какой то обходной путь...
17 июн 14, 13:04    [16175356]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fat32al1ty
Glory,

Должен быть какой то обходной путь...

А то
Для повторного использования результатов запроса наверное нужно будет эти результаты сохранить в серверном объекте
17 июн 14, 13:13    [16175424]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Добрый Э - Эх
Guest
fat32al1ty
Glory,

Вопрос в другом, нужен select в начале.
спрячь CTE во VIEW. Там где нужно "select в начале" делаешь селект из этого вью.....
17 июн 14, 13:16    [16175454]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Добрый Э - Эх,

Интересный вариант, попробую.
17 июн 14, 14:06    [16175857]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4994
Рекурсивный запрос
17 июн 14, 15:07    [16176338]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4994
http://www-01.ibm.com/support/knowledgecenter/SSEPGG_8.2.0/com.ibm.db2.udb.doc/admin/r0000879.htm?lang=en
17 июн 14, 15:09    [16176362]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
fat32al1ty
Glory,

Вопрос в другом, нужен select в начале.


Может вы забыли ; перед WITH поставить ?
17 июн 14, 15:15    [16176417]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
fat32al1ty
Glory,

Должен быть какой то обходной путь...


100%, один как минимум.
17 июн 14, 15:40    [16176636]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Все еще более усложнилось тем что в таблице обнаружены циклические связи. Как их предупредить в запросе? из базы убирать нельзя.
17 июн 14, 19:03    [16178031]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
fat32al1ty
Все еще более усложнилось тем что в таблице обнаружены циклические связи. Как их предупредить в запросе? из базы убирать нельзя.


Могу предложить отслеживать цепочку, по которой вы прошли в рекурсии (конкатенировать в строку ID-шники), и LIKE-ом проверять, есть текущий ID-шник в цепочке или нет.
17 июн 14, 20:25    [16178202]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Нужна помощь. Необходимо сформировать запрос который для каждого элемента из одной таблицы применит рекурсивный запрос (найдет его потомков) и запишет результат во вьюху. Чтобы дальше с этой вьюхи селектом выбирать.
19 июн 14, 16:08    [16190457]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
fat32al1ty
Нужна помощь. Необходимо сформировать запрос который для каждого элемента из одной таблицы применит рекурсивный запрос (найдет его потомков) и запишет результат во вьюху. Чтобы дальше с этой вьюхи селектом выбирать.
Вы сходите, что ли, почитайте, что такое "вьюха".
19 июн 14, 16:09    [16190465]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
select * from maximo.ci where cinum in (
with Rectab (SOURCECI,TARGETCI) as (select SOURCECI, TARGETCI from maximo.cirelation where TARGETCI ='SW08100000229' --/// вместо этого элемента необходимо перебрать перечень из другой таблицы
union all
select Rectab.TARGETCI, cr2.SOURCECI from Rectab, maximo.cirelation cr2
where Rectab.SOURCECI=cr2.TARGETCI)
select distinct rectab.SOURCECI from Rectab where rectab.SOURCECI in (select CINUM from maximo.ci where CLASSSTRUCTUREID = '1157' )
)
19 июн 14, 16:11    [16190493]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Гавриленко Сергей Алексеевич,

VIEW
19 июн 14, 16:12    [16190503]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fat32al1ty
VIEW

И что в них уже можно записать данные ?
19 июн 14, 16:13    [16190524]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
fat32al1ty
Member

Откуда:
Сообщений: 16
Glory,

не корректно выразился. Нужно сформировать её с использованием предложенного запроса.
19 июн 14, 16:16    [16190555]     Ответить | Цитировать Сообщить модератору
 Re: Как применить select к CTE ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
fat32al1ty
Нужно сформировать её с использованием предложенного запроса.

Ну так сформируйте. В чем проблема ?
19 июн 14, 16:17    [16190560]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить