【问题标题】:Need rownum to be the same for for each record between two queries that query the same tables对于查询相同表的两个查询之间的每条记录,需要 rownum 相同
【发布时间】: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 无法为您提供一致性

标签: sql oracle


【解决方案1】:

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

从 ( ... 按 opno 排序);

您也可以尝试使用 RANK 分析功能: select rank() over (order by opno), cnt, opno from (...);

【讨论】:

  • 移动 ORDER BY 有效。非常感谢。我之前尝试过,但是在两个联合查询中。这会导致 group by 出错。但是,是的,在primary() 中最后一个order by。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 2020-06-18
  • 2013-05-13
相关资源
最近更新 更多