我需要根据具有日期值的另一列(在同一个表中)从表中的几列中获取不同时间段的数据,例如当年和上一年。我使用不同的别名和连接两次使用同一个表,如下所示:
SELECT
NVL(SUM(a1.col1), 0) AS c1,
NVL(SUM(a1.col2), 0) AS c2,
NVL(SUM(a1.col3), 0) AS c3,
NVL(SUM(a1.col4), 0) AS c4,
NVL(SUM(a2.col1), 0) AS o1,
NVL(SUM(a2.col2), 0) AS o2,
NVL(SUM(a2.col3), 0) AS o3,
NVL(SUM(a2.col4), 0) AS o4 ,
b.u_id
FROM
(SELECT *
FROM a
WHERE to_char(run_date, 'YYYY') = to_char(SYSDATE, 'YYYY')
) a1,
(SELECT *
FROM a
WHERE to_char(run_date, 'YYYY') = to_char(SYSDATE, 'YYYY') - 1
) a2,
(SELECT u_id
FROM b
) p
WHERE a1.u_id (+) = b.u_id
AND a2.u_id (+) = b.u_id
GROUP BY b.u_id
还尝试通过限制只使用表一次来改进上述查询。查询有点像这样:
SELECT
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'),a.col1, 0)), 0) AS c1,
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'), a.col2, 0)), 0) AS c2,
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'), a.col3, 0)), 0) AS c3,
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'), a.col4, 0)), 0) AS c4,
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col1, 0)), 0) AS p1,
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col2, 0)), 0) AS p2,
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col3, 0)), 0) AS p3,
NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col4, 0)), 0) AS p4,
b.u_id
FROM a, b
WHERE to_char(a.run_date, 'YYYY') IN (to_char(SYSDATE, 'YYYY'),(to_char(SYSDATE, 'YYYY') - 1))
AND a.u_id = b.u_id
GROUP BY b.u_id
这对于大数据运行有点慢。你能建议任何替代查询吗?谢谢