我是一名学习SQL的C#开发人员。我编写了以下使用临时表的脚本。
但是,据我所知,应避免临时表。
为什么不使用它们?
我应该如何重写它以不使用临时表?
为了解释sql,它从两个不同的表中收集数据,然后将这两个临时表连接在一起并进行比较。它基本上找到第一个临时表中不在第二个临时表中的记录。
if object_id('tempdb..#pa') is not null
drop table #pa
Select dm.document_code, sm.segment_code
into #pa
from [dbo].[metadata_document_set] ds
join [dbo].[document_metadata] dm
on dm.metadata_document_set_id = ds.metadata_document_set_id
join segment_metadata sm
on dm.document_metadata_id = sm.document_metadata_id
where ds.code = 'PA'
and dm.code <> 'TEST'
and sm.not_in_spec = 0
if object_id('tempdb..#oh') is not null
drop table #oh
Select dm.document_code, sm.segment_code
into #oh
from [dbo].[metadata_document_set] ds
join [dbo].[document_metadata] dm
on dm.metadata_document_set_id = ds.metadata_document_set_id
join segment_metadata sm
on dm.document_metadata_id = sm.document_metadata_id
where ds.code = 'OH'
and dm.code <> 'TEST'
and sm.not_in_spec = 0
select * from #oh oh
left join #pa pa
on pa.segment_code = oh.segment_code and
pa.document_code = oh.document_code
where pa.document_code is null
order by oh.document_code, oh.segment_code
答案 0 :(得分:3)
使用CTE或子查询。
而不是
Select dm.document_code, sm.segment_code
into #pa
from [dbo].[metadata_document_set] ds
使用WITH
创建子查询
WITH temporalPA as (
Select dm.document_code, sm.segment_code
from [dbo].[metadata_document_set] ds
)
SELECT *
FROM temporalPA
您也可以直接使用子查询,但不容易阅读。
SELECT *
FROM ( Select dm.document_code, sm.segment_code
from [dbo].[metadata_document_set] ds
) as temporalPA
要将完整重写添加到此答案:
--Return all segments which are in OH, but not PA
with tempPA as (
Select dm.document_code, sm.segment_code
from [dbo].[metadata_document_set] ds
join [dbo].[document_metadata] dm
on dm.metadata_document_set_id = ds.metadata_document_set_id
join segment_metadata sm
on dm.document_metadata_id = sm.document_metadata_id
where ds.code = 'PA'
and dm.code <> 'TEST'
and sm.not_in_spec = 0
),
tempOH as(
Select dm.document_code, sm.segment_code
from [dbo].[metadata_document_set] ds
join [dbo].[document_metadata] dm
on dm.metadata_document_set_id = ds.metadata_document_set_id
join segment_metadata sm
on dm.document_metadata_id = sm.document_metadata_id
where ds.code = 'OH'
and dm.code <> 'TEST'
and sm.not_in_spec = 0
)
select * from tempOH oh
left join tempPA pa
on pa.segment_code = oh.segment_code and
pa.document_code = oh.document_code
where pa.document_code is null
order by oh.document_code, oh.segment_code