【发布时间】:2019-02-21 21:04:46
【问题描述】:
我有两个存储用户操作数据的表(几乎完全相同的结构)。用户可以在其中一个表中,但不在另一个表中,或者在两个表中(或两者都不在)。
我有两个查询,通过 UNION ALL 查询两个表。我需要每个查询中相同数量的记录,两个数据集之间的每个用户记录的 ROWNUM 相同。
我反转了两个查询之间的联合,对它们进行相同的排序。但是,即使数据应该以相同的顺序检索,rownum 也是不同的。任何见解将不胜感激。
(我将这些数据输入到一个图表组件中,其中 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`
【问题讨论】:
-
如果添加或删除数据,rownum 无法为您提供一致性