【发布时间】:2011-12-23 05:42:32
【问题描述】:
我有 2 张桌子。表“Accs”包含 900 万行(3 列:acc_id、月、年)。 首先我需要提取包含帐号部分条目的记录, 然后在这些记录中找到完全匹配,如果没有-则第一个部分匹配
WITH t AS (
SELECT a.acc_id,
t1.as,
t1.cust,
t1.curr,
t1.code,
t1.depart,
t1.sdate,
t1.stype,
t1.amount,
t1.s_id
FROM table1 t1
LEFT JOIN Accs a
ON SUBSTR(a.acc_id,7,12)=t1.curr||LPAD(t1.code,4,'0')||LPAD(t1.depart,3,'0')
WHERE t1.sdate='20.11.2011' AND t1.stype='A' AND a.month=11 ANd a.year=2011)
SELECT MAX(t.s_id),
(CASE WHEN t.as='000000'
THEN (CASE WHEN ac2.acc_id IS NOT NULL THEN ac2.acc_id ELSE t.acc_id END)
ELSE t.cust||t.curr||LPAD(t.code,4,'0')||LPAD(t.depart,3,'0') END) acc_id
FROM t
LEFT JOIN (SELECT t.acc_id FROM t) ac2
ON SUBSTR(ac2.acc_id,1,6)='000'||LPAD(t.depart,3,'0')
GROUP BY
(CASE WHEN t.as='000000'
THEN (CASE WHEN ac2.acc_id IS NOT NULL THEN ac2.acc_id ELSE t.acc_id END)
ELSE t.cust||t.curr||LPAD(t.code,4,'0')||LPAD(t.depart,3,'0') END)
此查询需要很长时间。我这样做是否正确?
【问题讨论】:
-
我怀疑你能否加快速度。您的很多连接都是在计算结果上完成的,这意味着无法使用索引。
-
将这些计算字段存储在派生字段中(这在一定程度上使thigns 非规范化),但允许使用索引。
-
你为什么这样做:
LEFT JOIN (SELECT t.acc_id FROM t) ac2 ON ...如果你只是加入 t 并给它起别名,它可能会更快。不需要额外的选择。 -
你怎么能读到这样的查询。 Oracle 对标识符的 30 个字符的限制是荒谬的,但这并不意味着必须将它们全部截断为 4 个。:)
-
请贴出执行计划、表定义和涉及的表上定义的索引
标签: sql oracle plsql oracle10g