在查询相同表的两个查询之间,每个记录的行号都必须相同

时间:2019-02-21 21:04:47

标签: sql oracle

我有两个存储用户操作数据的表(几乎完全相同的结构)。用户可以在一个表中,但不能在另一个表中,也可以在两个表中(或都不在两个表中)。

我有两个查询,它们通过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`

Query1

Query 2

1 个答案:

答案 0 :(得分:0)

ROWNUM不一定是一致的,因为它不是存储的值。也就是说,出于您的目的,可以通过在()块内移动ORDER BY来获得所需的结果。

从(中选择rownum,cnt,opno ... 通过opno订购);

或者,您可以尝试使用RANK分析功能: 在(...)上选择rank()(按opno排序),cnt,opno;