暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 临时表

askTom 2018-08-27
290

问题描述

大家好,

我是最近从PL/SQL转换为SQL Developer & Oracle。因此,我大量使用 # temptables,并且非常不鼓励编写尝试在一个查询中执行所有操作的 “超级sql” 脚本。

现在,我了解到Oracle的情况恰恰相反。我对此没有任何问题,我只是对为什么不使用temptables感到困惑,因为它们对于在多步骤,复杂查询中开发逻辑非常有益。将所有内容干扰到单个查询中似乎很奇怪,并且会使编写初始脚本变得更加困难。我在下面提供了一个小例子。

select patient, patientAGE, DOB
into #tmp1
from Patients

select patient, diabetesDX, DxDate
into #tmp2
from diagnoses

select patient, A1Clvl, MAX(dateoflab) as DOL
into #tmp3
from labs
where A1C >= 9
GROUP BY patient, A1Clvl

select t1.*, t2.A1Clvl, t2.DOL, t3.A1Clvl, DOL 
from #tmp1 t1
   LEFT JOIN #tmp2 t2 ON t2.patient = t1.patient
   LEFT JOIN #tmp3 t3 ON t3.patient = t3.patient
复制


所有输入表示赞赏。

-约翰

专家解答

你有几个选择。我们在18c中有私有临时表,可以以与 # temp表相同的方式使用-您只需要定义它们即可。这样做的成本基本上是零,因为他们完全生活在你的会议。这里非常简单的演示



但是另一种选择是使用的子句,它使您可以保持类似于临时表的流,但仍然有一个查询。你上面的例子是:

with tmp1 as (
select patient, patientAGE, DOB
from Patients),
tmp2 as (
select patient, diabetesDX, DxDate
from diagnoses),
tmp3 as (
select patient, A1Clvl, MAX(dateoflab) as DOL
from labs
where A1C >= 9
GROUP BY patient, A1Clvl
)
select t1.*, t2.A1Clvl, t2.DOL, t3.A1Clvl, DOL 
from tmp1 t1
   LEFT JOIN tmp2 t2 ON t2.patient = t1.patient
   LEFT JOIN tmp3 t3 ON t3.patient = t3.patient
复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论