ответ

7

Вы можете использовать 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). Он будет доступен до тех пор, пока он не упадет или сервер не будет перезапущен.

+0

Большое спасибо julien .. – SQLnewbe

 Смежные вопросы

  • Нет связанных вопросов^_^