如何在不使用临时表的情况下编写此脚本

时间:2017-01-19 15:23:43

标签: sql sql-server tsql sql-server-2012

我是一名学习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 

1 个答案:

答案 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