gpt4 book ai didi

sql - 在 PL/SQL 中创建临时表

转载 作者:行者123 更新时间:2023-12-04 13:06:29 25 4
gpt4 key购买 nike

我正在使用 Oracle 10g 数据库,我想从一个表中提取一组记录,然后使用它从一堆相关表中提取记录。

如果这是 T-SQL,我会这样做:

CREATE TABLE #PatientIDs (
pId int
)

INSERT INTO #PatientIDs
select distinct pId from appointments

SELECT * from Person WHERE Person.pId IN (select pId from #PatientIDs)

SELECT * from Allergies WHERE Allergies.pId IN (select pId from #PatientIDs)

DROP TABLE #PatientIDs

然而,我看到的所有有用的页面让这看起来比它可能做的工作要多得多,所以我想我一定遗漏了一些明显的东西。

(顺便说一句,我可能不会将其作为一个脚本运行,而是在 Oracle SQL Developer 中打开一个 session ,创建临时表,然后运行每个查询,然后将它们导出为 CSV。这行得通吗?)

最佳答案

Oracle 有临时表,但它们需要显式创建:

create global temporary table...

临时表中的数据对于创建它的 session 是私有(private)的,并且可以是特定于 session 或特定于事务的。如果数据是 不是 要在 session 结束之前删除,您需要使用 ON COMMIT PRESERVE ROWS在 create 语句的末尾。他们也没有回滚或提交支持......

在您给出的示例中,我认为不需要临时表 - 对 APPOINTMENTS 进行更新存在风险。表,因为临时表正在填充将不会被反射(reflect)。使用 IN/EXISTS/JOIN:
SELECT p.* 
FROM PERSON p
WHERE EXISTS (SELECT NULL
FROM APPOINTMENTS a
WHERE a.personid = a.id)

SELECT p.*
FROM PERSON p
WHERE p.personid IN (SELECT a.id
FROM APPOINTMENTS a)

SELECT DISTINCT p.*
FROM PERSON p
JOIN APPOINTMENTS a ON a.id = p.personid

如果有多个 APPOINTMENT 记录与单个 PERSON 记录相关联,则 JOINing 有重复的风险,这就是我添加 DISTINCT 的原因。

关于sql - 在 PL/SQL 中创建临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3462131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com