【发布时间】:2015-07-19 15:49:53
【问题描述】:
我使用oracle sql developer。 我有一个疑问和一件事,我遇到了一些麻烦: 1)我需要做一个有一些规则的选择。
- 此选择必须返回表 1 中的信息。
- Table2 是 table1 的“子”。
- 每个表中的日期必须与当前表的月份/年份相同。
- idrule 在两个表中都不能为 no。
- 在最终的返回中,它必须只有来自 table1 的数据必须是我所说的子选择中的 nrtable 和 nrgroupby 的数据。
如果不清楚我已经做了一个,那行得通,但这有点愚蠢,因为我认为有一些方法可以做到这一点,或者更有效或更易读,因为这种方式我几乎必须重写同样选择两次:
SELECT *
FROM TABLE1
WHERE NRSEQTABLE1 IN
(SELECT DECODE(T1.NRSEQTABLE1,NULL, T2.NRSEQTABLE1, T1.NRSEQTABLE1) AS NRSEQTABLE1
FROM
(SELECT NRSEQTABLE1,
NRNUM2
FROM TABLE1 T1
WHERE TO_CHAR(DTHRTABLE1, 'MM/YYYY') = TO_CHAR(SYSDATE, 'MM/YYYY')
AND IDRULE = 'NO'
) T1
FULL JOIN
(SELECT NRSEQTABLE1,
NRNUM2
FROM TABLE2 T2
WHERE TO_CHAR(DTHRTABLE2, 'MM/YYYY') = TO_CHAR(SYSDATE, 'MM/YYYY')
AND IDRULE = 'NO'
) T2
ON T2.NRSEQTABLE1 = T1.NRSEQTABLE1
AND T2.NRNUM2 = T1.NRNUM2
)
AND NRGROUPBY IN
(SELECT NRGROUPBY
FROM TABLE1
WHERE NRSEQTABLE1 IN
(SELECT DECODE(T1.NRSEQTABLE1,NULL, T2.NRSEQTABLE1, T1.NRSEQTABLE1) AS NRSEQTABLE1
FROM
(SELECT NRSEQTABLE1,
NRNUM2
FROM TABLE1 T1
WHERE TO_CHAR(DTHRTABLE1, 'MM/YYYY') = TO_CHAR(SYSDATE, 'MM/YYYY')
AND IDRULE = 'NO'
) T1
FULL JOIN
(SELECT NRSEQTABLE1,
NRNUM2
FROM TABLE2 T2
WHERE TO_CHAR(DTHRTABLE2, 'MM/YYYY') = TO_CHAR(SYSDATE, 'MM/YYYY')
AND IDRULE = 'NO'
) T2
ON T2.NRSEQTABLE1 = T1.NRSEQTABLE1
AND T2.NRNUM2 = T1.NRNUM2
)
GROUP BY TABLE1.NRGROUPBY
HAVING COUNT(TABLE1.NRSEQTABLE1) > 10
)
ORDER BY NRGROUPBY,
NRSEQTABLE1;
抱歉,英语不好,感谢您的帮助
【问题讨论】:
标签: sql oracle performance readability