Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 24.03.2019, 20:15   #1
Glowworm
Форумчанин
 
Аватар для Glowworm
 
Регистрация: 26.10.2011
Адрес: Россия, Белгород
Сообщений: 64
Репутация: 10

icq: 604626950
По умолчанию Оператор 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, 20:20   #2
xxbesoxx
Профессионал
 
Аватар для xxbesoxx
 
Регистрация: 10.08.2010
Адрес: Грузия Рустави
Сообщений: 1,333
Репутация: 719
Отправить сообщение для xxbesoxx с помощью Yahoo
По умолчанию

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

icq: 604626950
По умолчанию

Цитата:
Сообщение от 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, 21:09   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,765
Репутация: 6592
По умолчанию

Код:

with a_cte (...)
as (...)
select ...
into #MyTempTable
from ...

__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 24.03.2019, 21:17   #5
xxbesoxx
Профессионал
 
Аватар для xxbesoxx
 
Регистрация: 10.08.2010
Адрес: Грузия Рустави
Сообщений: 1,333
Репутация: 719
Отправить сообщение для xxbesoxx с помощью Yahoo
По умолчанию

Цитата:
Сообщение от 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
__________________
E_MAIL: rijgvina7@yahoo.com

Последний раз редактировалось xxbesoxx; 24.03.2019 в 21:23.
xxbesoxx на форуме   Ответить с цитированием
Старый 24.03.2019, 21:31   #6
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,765
Репутация: 6592
По умолчанию

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

icq: 604626950
По умолчанию

Цитата:
Сообщение от 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, 16:34   #8
xxbesoxx
Профессионал
 
Аватар для xxbesoxx
 
Регистрация: 10.08.2010
Адрес: Грузия Рустави
Сообщений: 1,333
Репутация: 719
Отправить сообщение для xxbesoxx с помощью Yahoo
По умолчанию

Цитата:
Сообщение от 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

Работает... Но вам это НЕ нужно .!
__________________
E_MAIL: rijgvina7@yahoo.com
xxbesoxx на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сохранить ответы (сохранить результат игры) и не срабатывает рандом в вопросах geto C++ Builder 0 03.05.2017 19:28
Сохранить результат DragAndDrop визуальных компонентов (Delphi 6) hudrogen Общие вопросы Delphi 9 11.02.2016 18: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


23:20.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru