我有2张桌子。表“Accs”包含900万行(3列:acc_id,月份,年份)。 首先,我需要提取包含的账号, 部分条目,然后在这些记录中找到完全匹配,如果不记录 - 那么第一部分匹配如何优化下一个oracle查询?
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)
这个查询需要较长时间。我是否正确?
我怀疑你可以加快速度。很多连接都是在计算结果上完成的,这意味着索引不能使用。 – 2011-12-23 05:44:47
有没有其他更快的方法来做同样的事情? – DmitryB 2011-12-23 05:52:52
将这些计算出的字段存储在派生字段中(这会使某些字符非规格化),但确实允许使用索引。 – 2011-12-23 05:53:55