我有两个存储用户操作数据的表(几乎完全相同的结构)。用户可以在一个表中,但不能在另一个表中,也可以在两个表中(或都不在两个表中)。
我有两个查询,它们通过UNION ALL查询两个表。在每个查询中,我需要相同数量的记录,而在两个数据集之间,ROWNUM的每个用户记录都相同。
我颠倒了两个查询之间的联合,对它们进行了相同的排序。但是,即使应该以相同的顺序检索数据,行数也不同。任何见识将不胜感激。
(我正在将这些数据输入到graph \ chart组件中,在其中需要ROWNUM才能正常工作)
查询1
SELECT ROWNUM, cnt, opno FROM (
SELECT SUM(fieldct) cnt, opno
FROM operchgeedp
WHERE opno < 997
AND LOWER(prognm) = 'eedpmain.exe'
AND TRUNC(begdtt) BETWEEN DATE'2019-02-01'
AND TRUNC(SYSDATE)
GROUP BY opno
UNION ALL
SELECT 0 cnt, opno
FROM operchgprv
WHERE opno NOT IN (
SELECT opno
FROM operchgeedp
WHERE opno < 997
AND LOWER(prognm) = 'eedpmain.exe'
AND TRUNC(begdtt) BETWEEN DATE'2019-02-01'
AND TRUNC(SYSDATE)
)
AND TRUNC(begdtt) BETWEEN DATE'2019-02-01'
AND TRUNC(SYSDATE)
AND opno < 997
GROUP BY opno )
ORDER BY opno`
查询2
SELECT ROWNUM, cnt, opno FROM (
SELECT SUM(fieldct) cnt, opno
FROM operchgprv
WHERE opno < 997
AND LOWER(prognm) = 'prvmain.exe'
AND TRUNC(begdtt) BETWEEN DATE'2019-02-01'
AND TRUNC(SYSDATE)
GROUP BY opno
UNION ALL
SELECT 0 cnt, opno
FROM operchgeedp
WHERE opno NOT IN (
SELECT opno
FROM operchgprv
WHERE opno < 997
AND LOWER(prognm) = 'prvmain.exe'
AND TRUNC(begdtt) BETWEEN DATE'2019-02-01'
AND TRUNC(SYSDATE)
)
AND TRUNC(begdtt) BETWEEN DATE'2019-02-01'
AND TRUNC(SYSDATE)
AND opno < 997
GROUP BY opno )
ORDER BY opno`
答案 0 :(得分:0)
ROWNUM不一定是一致的,因为它不是存储的值。也就是说,出于您的目的,可以通过在()块内移动ORDER BY来获得所需的结果。
从(中选择rownum,cnt,opno ... 通过opno订购);
或者,您可以尝试使用RANK分析功能: 在(...)上选择rank()(按opno排序),cnt,opno;