【发布时间】:2021-01-28 16:51:27
【问题描述】:
我目前正在尝试为 Oracle DB 编写查询,以获取有关患者住院时间的一些信息。对于他每天在特定领域获得特定分数 - 因此我必须加入多个表格才能获得实际的每日分数(而不是完整分数)。
我的第一次尝试(这是有效的,但我想以另一种格式显示)是这样的:
SELECT
f.FALLID AS "ID",
f.FALLNR AS "Fallnummer",
DECODE(e.SCOREID, 12, 'SAPS', 13, 'TISS', 'X') AS "Score",
to_char(e.VON, 'DD.MM.YYYY') AS "Datum (von)",
-- to_char(e.BIS, 'DD.MM.YYYY') AS "Datum (bis)",
scp.BEZEICHNUNG AS "Bezeichnung",
s.PUNKTE AS "Punkte"
FROM
FALL f
JOIN OS_MUP.EINSTUFUNG e ON e.FALLID = f.FALLID
JOIN OS_MUP.EINSTUFUNGSRANG einr ON einr.EINSTUFUNGID = e.EINSTUFUNGID
JOIN OS_MUP.SCORERANG s ON s.SCORERANGID = einr.SCORERANGID
JOIN OS_MUP.SCOREPOSITION scp ON scp.SCOREPOSITIONID = s.SCOREPOSITIONID
WHERE
f.FALLNR = 1234567
ORDER BY
e.SCOREID, e.VON
这以以下形式显示结果:
+------+---------+-------+------------+-------------+--------+
| ID | Fallnr | Score | Date | Description | Points |
+------+---------+-------+------------+-------------+--------+
| 1234 | 1234567 | ABCD | 05.05.2020 | Age | 12 |
| 1234 | 1234567 | ABCD | 05.05.2020 | Temperature | 2 |
+------+---------+-------+------------+-------------+--------+
没关系,但我不想重复列的日期和每天的描述,我想得到这样的外观:
+------+---------+-------+------------+-----+-------------+
| ID | Fallnr | Score | Date | Age | Temperature |
+------+---------+-------+------------+-----+-------------+
| 1234 | 1234567 | ABCD | 05.05.2020 | 12 | 2 |
| 1234 | 1234567 | ABCD | 06.05.2020 | 12 | 2 |
+------+---------+-------+------------+-----+-------------+
所以我修改了查询并在此刻完成了这个:
variable var number
exec :var := 2068237610
SELECT
dt1.FALLNR AS "Fallnummer",
to_char(dt1.VON, 'DD.MM.YYYY') AS "Datum",
dt1.PUNKTE AS "Alter",
dt2.PUNKTE AS "Herzfrequenz"
--dt3.PUNKTE AS "RR Syst.",
--dt4.PUNKTE AS "Körpertemp.",
--dt5.PUNKTE AS "PaO2/FiO2"
-- dt6.PUNKTE AS "Urin",
-- dt7.PUNKTE AS "Leukozyten"
FROM (
SELECT
f.FALLID,
f.FALLNR,
s.PUNKTE,
e.VON
FROM Fall f
JOIN OS_MUP.EINSTUFUNG e ON e.FALLID = f.FALLID
JOIN OS_MUP.EINSTUFUNGSRANG einr ON einr.EINSTUFUNGID = e.EINSTUFUNGID
JOIN OS_MUP.SCORERANG s ON s.SCORERANGID = einr.SCORERANGID
WHERE
s.SCOREPOSITIONID = 10003 AND f.FALLNR = :var /* Alter */
) dt1
JOIN
(SELECT
f.FALLNR,
s.PUNKTE,
e.VON
FROM Fall f
JOIN OS_MUP.EINSTUFUNG e ON e.FALLID = f.FALLID
JOIN OS_MUP.EINSTUFUNGSRANG einr ON einr.EINSTUFUNGID = e.EINSTUFUNGID
JOIN OS_MUP.SCORERANG s ON s.SCORERANGID = einr.SCORERANGID
WHERE
s.SCOREPOSITIONID = 10004 AND f.FALLNR = :var /* Herzfrequenz */
) dt2
ON dt1.FALLNR = dt2.FALLNR AND dt1.VON = dt2.VON
ORDER BY dt1.VON
这是我希望它工作的工作,但我必须一遍又一遍地进行这些连接以获得更多列,并且还有 5-6 更多列 - 以及由创建的嵌套循环的原因加入这个版本的查询非常慢(比如慢了 250 秒)。
是否有机会以更少使用联接的另一种方式实现我的目标?
提前致谢!
【问题讨论】:
标签: sql oracle performance