может кто-нибудь сказать мне, где использовать CTE, таблицу temp и переменную таблицы. я читал об их различиях, но я смущен их использованием. пожалуйста помоги. Благодарю.CTE, переменная таблицы и таблицы таблицы
ответ
Вы можете использовать CTE вместо дополнительного запроса или когда вам нужна рекурсия.
CTE доступен только в операторе SQL, который включает его. Предшествующие и последующие утверждения не будут иметь к нему доступа и не будут его видеть. Он ведет себя как подзапрос, но может использоваться несколько раз в следующем выборе/обновлении.
Этот запрос с подзапросом с подзапросом используется дважды:
Select D.* From D
Inner Join (
Select id value, date From A
Inner Join B on A.data < B.date
Inner Join C on C.data > B.date
) CTE a c1 on c1.id = D.id+1
Inner Join (
Select id value, date From A
Inner Join B on A.data < B.date
Inner Join C on C.data > B.date
) as c2 on c2.id = D.id-1
Может быть заменен КТР:
; with CTE as (
Select id value, date From A
Inner Join B on A.data < B.date
Inner Join C on C.data > B.date
)
Select D.* From D
Inner Join CTE as c1 on c1.id = D.id+1
Inner Join CTE as c2 on c2.id = D.id-1
Это полезно в этом случае, так как тот же суб-запрос не должны быть написаны несколько раз.
Рекурсивного CTE (это только пример, это не должно быть SQL Server задания, чтобы манипулировать строки данных, как это):
Declare @data varchar(50) = 'Recursive CTE'
; With list(id, letter) as (
Select 1, SUBSTRING(@data, 1, 1)
Union All
Select id+1, SUBSTRING(@data, id+1, 1) From list
Where id < len(@data)
)
Select * from list
Рекурсивный CTE может использоваться для получения данных в иерархии.
Таблица переменных
Таблица переменных существует только тогда, когда запрос выполняется. Он отображается всем SQL-операторам после его создания.
Вы можете использовать их, когда вам нужно передать данные хранимой процедуры или функции, используя параметр типа таблицы:
Create Proc test(
@id int,
@list table_type_list READONLY
)
begin
set nocount on
select * from @list
end
Declare @t table_type_list
Insert into @t(name) values('a'), ('b'), ('c')
Exec test 1, @t
Вы также можете использовать их, когда вам нужно сохранить то, что не является слишком большим и не требует индексов. Вы не можете вручную создать индекс, хотя первичный ключ или уникальное ограничение в объявлении таблицы автоматически создаст индекс.
Статистика таблиц не создается, и вы не можете создавать статистику.
Temp Таблица
таблицу Temp можно использовать, когда вы имеете дело с гораздо большим количеством данных, которые выиграют от создания индексов и статистики.
В сеансе, любое заявление может использовать или изменить таблицу, как только он был создан:
create table #temp
Insert into #temp(...) select ... From data
exec procA
exec procB
exec procC
И проца, ProcB и ProcC может выбрать, вставка, удаление или обновление данных из #temp.
Таблица #temp будет удалена, как только сессия пользователя будет закрыта.
Если вы не храните временную таблицу между сеансами, вы можете использовать глобальную таблицу темп (## temp). Он будет доступен до тех пор, пока он не упадет или сервер не будет перезапущен.
Большое спасибо julien .. – SQLnewbe