Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2019, 19:15   #1
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию Оператор With. Как сохранить результат.

Всем привет.
В нете мало инфы об операторе with. А именно не нашла ничего о том можно ли сохранить результат оператора во временную таблицу или использовать с join.
Надеюсь, что вы растолкуете мне эти моменты.

Привожу пример, как я пыталась сделать, но получаю ошибку выполнения запроса.

select t.proj_id, uvn.udf_text NUM, uvc.udf_text Constructive, r.rsrc_short_name FO_RSRC_NAME,

tr.target_qty, tr.remain_qty, tr.act_reg_qty act_qty, t.task_code, t.task_id,

ac.acct_name,r.rsrc_type,rcat.rsrc_ catg_short_name,ta.bloc_id,ta.bloc_ name

from privuser.TASK t

join privuser.TASKRSRC tr on tr.task_id = t.task_id

join privuser.RSRC r on r.rsrc_id = tr.rsrc_id

join privuser.UDFVALUE uvn on uvn.udf_type_id = 1000001 and uvn.fk_id = t.task_id

join privuser.UDFVALUE uvc on uvc.udf_type_id = 1000000 and uvc.fk_id = t.task_id

left join

( with a_cte (actv_code_id, parent_actv_code_id, short_name, actv_code_name)

as (

--якорь рекурсии

select ac.actv_code_id, ac.parent_actv_code_id,

ac.short_name short_name, ac.actv_code_name

from privuser.ACTVTYPE at

join privuser.ACTVCODE ac on ac.actv_code_type_id = at.actv_code_type_id

where at.actv_code_type = 'Блок' and ac.parent_actv_code_id is null

union all

select ac.actv_code_id, ac.parent_actv_code_id,

a.short_name || '.' || ac.short_name short_name, ac.actv_code_name

from privuser.ACTVCODE ac

join a_cte a on a.actv_code_id = ac.parent_actv_code_id

)


select ta.task_id , a_cte.short_name bloc_id, a_cte.actv_code_name bloc_name

from

privuser.TASKACTV ta

join a_cte on ta.actv_code_id = a_cte.actv_code_id

where ta.proj_id in (4440)) on a_cte.task_id = t.task_id

left join privuser.ACCOUNT ac on ac.acct_id = tr.acct_id

left join (

select rcv.rsrc_catg_short_name, rcat.rsrc_id, rct.rsrc_catg_type

from privuser.rcattype rct

join privuser.rcatval rcv on rcv.rsrc_catg_type_id = rct.rsrc_catg_type_id

join privuser.rsrcrcat rcat on rcat.rsrc_catg_id = rcv.rsrc_catg_id

where

rct.rsrc_catg_type = 'Физобъем'

) rcat on rcat.rsrc_id = tr.rsrc_id

where t.proj_id in ('2685') and r.rsrc_type in ('RT_Mat', 'RT_Labor')
Glowworm вне форума Ответить с цитированием
Старый 24.03.2019, 19:20   #2
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от Glowworm Посмотреть сообщение
В нете мало инфы об операторе with.
Производные таблицы - вот здесь всё нормально примером https://metanit.com/sql/sqlserver/10.4.php
xxbesoxx вне форума Ответить с цитированием
Старый 24.03.2019, 19:39   #3
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Производные таблицы - вот здесь всё нормально примером https://metanit.com/sql/sqlserver/10.4.php
Это конечно хорошо, но как мне сохранить результат оператора with

Делала так, но запрос завершается ошибкой


Код:
inset #temp 
into
with a_cte (actv_code_id, parent_actv_code_id, short_name, actv_code_name)

as (

--якорь рекурсии

  select ac.actv_code_id, ac.parent_actv_code_id,

         ac.short_name short_name, ac.actv_code_name

    from privuser.ACTVTYPE at

         join privuser.ACTVCODE ac on ac.actv_code_type_id = at.actv_code_type_id

    where at.actv_code_type = 'Блок' and ac.parent_actv_code_id is null

  union all

  select ac.actv_code_id, ac.parent_actv_code_id,

         a.short_name || '.' || ac.short_name short_name, ac.actv_code_name

    from privuser.ACTVCODE ac

         join a_cte a on a.actv_code_id = ac.parent_actv_code_id

)


select ta.task_id ,  a_cte.short_name bloc_id, a_cte.actv_code_name bloc_name

from

privuser.TASKACTV ta

join a_cte on ta.actv_code_id = a_cte.actv_code_id

where ta.proj_id in (4440))
Glowworm вне форума Ответить с цитированием
Старый 24.03.2019, 20:09   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
with a_cte (...)
as (...)
select ...
into #MyTempTable
from ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.03.2019, 20:17   #5
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от Glowworm Посмотреть сообщение
но как мне сохранить результат оператора with
Но вот так
Код:
create table #temp(t_id int,
                  t_name nvarchar(50)
				  )

--------Оператор With Производные таблица ---------
WITH MyTab AS
(   -- Мои запрос 
	select OrderID, ShipName
	from Orders
	where  EmployeeID=5
)
-------Инсерт ---------
insert into #temp (t_id, t_name)
select * from MyTab
-----Смотрим резултат-----
select * from #temp
Но, зачем это ? если результат запроса вы храните на #temp -это "временные таблица"?! смотрите, оператор with формирует "производные таблицу" из внутренние запрос
Код:
WITH MyTab AS
(   --  
	select -- это внутренние запрос
	 
)
Я думаю что лучше так
Код:
insert into #temp (t_id, t_name)
	select OrderID, ShipName
	from Orders
	where  EmployeeID=5
и потом работаем на временные таблицу #temp

Последний раз редактировалось xxbesoxx; 24.03.2019 в 20:23.
xxbesoxx вне форума Ответить с цитированием
Старый 24.03.2019, 20:31   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

чем insert во временную лучше select into? Для insert-а нужно создать таблицу предварительно, для select-а не надо. Если нужен индекс создай после, по времени без разницы, даже быстрей будет, чем при индексе созданном до заполнения
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.03.2019, 23:30   #7
Glowworm
Пользователь
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Но вот так
Код:
create table #temp(t_id int,
                  t_name nvarchar(50)
				  )

--------Оператор With Производные таблица ---------
WITH MyTab AS
(   -- Мои запрос 
	select OrderID, ShipName
	from Orders
	where  EmployeeID=5
)
-------Инсерт ---------
insert into #temp (t_id, t_name)
select * from MyTab
-----Смотрим резултат-----
select * from #temp
Но, зачем это ? если результат запроса вы храните на #temp -это "временные таблица"?! смотрите, оператор with формирует "производные таблицу" из внутренние запрос
Код:
WITH MyTab AS
(   --  
	select -- это внутренние запрос
	 
)
Я думаю что лучше так
Код:
insert into #temp (t_id, t_name)
	select OrderID, ShipName
	from Orders
	where  EmployeeID=5
и потом работаем на временные таблицу #temp

Я пробовала сделать, как вы описали. Но запрос вернулся с ошибкой, что ожидался select. Т.к. сразу после
WITH MyTab AS
( -- Мои запрос
select OrderID, ShipName
from Orders
where EmployeeID=5
)
Должен следовать Select * from MyTab
Glowworm вне форума Ответить с цитированием
Старый 25.03.2019, 15:34   #8
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от Glowworm Посмотреть сообщение
Но запрос вернулся с ошибкой
Смотрите...
1) Это локальную временную таблицу с именем #TabName .! Которая будет удалена, как только вы отключитесь. Если вы создаете глобальную временную таблицу ##TabName, любой пользователь в базе данных может работать с этой таблицей
Код:
create table #temp(t_id int,
                  t_name nvarchar(50)
				  )
2) Выполнить после создание временные таблицы это скрипт
Код:
--------Оператор With Производные таблица ---------
WITH MyTab AS
(   -- Мои запрос 
	select OrderID, ShipName
	from Orders
	where  EmployeeID=5
)
-------Инсерт ---------
insert into #temp (t_id, t_name)
select * from MyTab
-----Смотрим резултат-----
select * from #temp
Работает... Но вам это НЕ нужно .!
xxbesoxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сохранить ответы (сохранить результат игры) и не срабатывает рандом в вопросах geto C++ Builder 0 03.05.2017 18:28
Сохранить результат DragAndDrop визуальных компонентов (Delphi 6) hudrogen Общие вопросы Delphi 9 11.02.2016 17:59
Как сохранить результат команды ipconfig в текстовый файл ? adaptive person Общие вопросы Delphi 3 31.03.2012 23:03
Необычный оператор присвания и результат Стремящийся Общие вопросы C/C++ 14 29.02.2012 19:04
Повернуть изображение и сохранить результат new player Мультимедиа в Delphi 2 03.11.2011 12:57