【发布时间】:2014-03-13 21:21:21
【问题描述】:
我现有的查询如下所示:
SELECT p.subcode as proc_subcode,
r.subcode as rv_subcode,
r.rlv,
f.cfid,
f.geozip,
p.proc,
p.sh_descr,
f.begproc,
f.endproc,
p.descr,
r.modi,
f.per25
FROM user.code p, user.relative r, user.frequency f
WHERE f.ID = 'XOF'
AND f.GEOZIP = '200'
AND f.REL_DATE = '10-SEP-13'
AND p.proc IN ('A0021', 'A0080', 'A0090', 'A0100', 'A0110', 'A0120',
'A0130', 'A0140', 'A0160', 'A0170', 'A0180', 'A0190',
'A0200', 'A0210', 'A0225')
AND r.ID = f.ID
AND f.REL_DATE = r.REL_DATE
AND f.ID = p.ID
AND f.REL_DATE = p.REL_DATE
AND p.proc = r.proc
AND p.proc between f.begproc AND f.endproc
AND (('A0021' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0021' AND
r.PROC = 'A0021' AND f.CFID = '00') OR
('A0080' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0080' AND
r.PROC = 'A0080' AND f.CFID = '00') OR
('A0090' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0090' AND
r.PROC = 'A0090' AND f.CFID = '00') OR
('A0100' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0100' AND
r.PROC = 'A0100' AND f.CFID = '00') OR
('A0110' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0110' AND
r.PROC = 'A0110' AND f.CFID = '00') OR
('A0120' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0120' AND
r.PROC = 'A0120' AND f.CFID = '00') OR
('A0130' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0130' AND
r.PROC = 'A0130' AND f.CFID = '00') OR
('A0140' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0140' AND
r.PROC = 'A0140' AND f.CFID = '00') OR
('A0160' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0160' AND
r.PROC = 'A0160' AND f.CFID = '00') OR
('A0170' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0170' AND
r.PROC = 'A0170' AND f.CFID = '00') OR
('A0180' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0180' AND
r.PROC = 'A0180' AND f.CFID = '00') OR
('A0190' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0190' AND
r.PROC = 'A0190' AND f.CFID = '00') OR
('A0200' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0200' AND
r.PROC = 'A0200' AND f.CFID = '00') OR
('A0210' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0210' AND
r.PROC = 'A0210' AND f.CFID = '00') OR
('A0225' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0225' AND
r.PROC = 'A0225' AND f.CFID = '00'))
ORDER BY p.proc, r.modi, f.REL_DATE asc
上述查询运行良好,但是,我计划在范围内添加 100 个 p.proc,例如。就像 A0021-A1000。所以,我想提高sql查询性能。
有人可以帮忙吗?
编辑 1:
我想可能的解决方案是删除 p.proc 的 IN 子句并使用 between。不过我不确定最后一个 AND 条件。
编辑 2:
查询说明
我基本上是使用 geozip 并传递代码来获取特定区域的所有医疗费用,例如。 A0021 表示手术代码,200 表示纽约,2013 年 9 月 10 日是 XOF 产品的发布日期和获取结果。
【问题讨论】:
-
我删除了 mysql 标签,因为这个问题是关于 Oracle 的。
-
您能否向我们展示数据并解释您查询的含义?
-
"toms 规则 #1:永远不要将字符串与日期和日期与字符串进行比较。始终将字符串与字符串进行比较,将日期与日期进行比较!"
-
@MikkaRin - 刚刚编辑了问题以解释我在做什么。