在where子句中添加rownum时,all_tab_columns上的Select返回不明确的结果



这是我面临的一个非常奇怪的问题。我有一个模板表(DATA_template_table),它存储从XML上传的数据。DATA_TEMPLATE_Table表大约有52列。当我执行下面的查询时,它返回前6列:

   select TABLE_NAME,column_name from all_tab_columns
   where 1=1 
   and 
   table_name='DATA_TEMPLATE_TABLE'
   AND column_name <>'ID'
   AND column_name <>'QUERY_REF'
   and rownum <=6
   order by column_id;

但当我再次执行它时,它会给我最后6列。上述表格的结构如下:

CREATE TABLE DATA_TEMPLATE_TABLE
(
  ID         NUMBER                             NOT NULL,
  COL_V1     VARCHAR2(4000 BYTE),
  COL_V2     VARCHAR2(4000 BYTE),
  COL_V3     VARCHAR2(4000 BYTE),
  COL_V4     VARCHAR2(4000 BYTE),
  COL_V5     VARCHAR2(4000 BYTE),
  COL_V6     VARCHAR2(4000 BYTE),
  COL_V7     VARCHAR2(4000 BYTE),
  COL_V8     VARCHAR2(4000 BYTE),
  COL_V9     VARCHAR2(4000 BYTE),
  COL_V10    VARCHAR2(4000 BYTE),
  COL_V11    VARCHAR2(4000 BYTE),
  COL_V12    VARCHAR2(4000 BYTE),
  COL_V13    VARCHAR2(4000 BYTE),
  COL_V14    VARCHAR2(4000 BYTE),
  COL_V15    VARCHAR2(4000 BYTE),
  COL_V16    VARCHAR2(4000 BYTE),
  COL_V17    VARCHAR2(4000 BYTE),
  COL_V18    VARCHAR2(4000 BYTE),
  COL_V19    VARCHAR2(4000 BYTE),
  COL_V20    VARCHAR2(4000 BYTE),
  COL_V21    VARCHAR2(4000 BYTE),
  COL_V22    VARCHAR2(4000 BYTE),
  COL_V23    VARCHAR2(4000 BYTE),
  COL_V24    VARCHAR2(4000 BYTE),
  COL_V25    VARCHAR2(4000 BYTE),
  COL_V26    VARCHAR2(4000 BYTE),
  COL_V27    VARCHAR2(4000 BYTE),
  COL_V28    VARCHAR2(4000 BYTE),
  COL_V29    VARCHAR2(4000 BYTE),
  COL_V30    VARCHAR2(4000 BYTE),
  COL_V31    VARCHAR2(4000 BYTE),
  COL_V32    VARCHAR2(4000 BYTE),
  COL_V33    VARCHAR2(4000 BYTE),
  COL_V34    VARCHAR2(4000 BYTE),
  COL_V35    VARCHAR2(4000 BYTE),
  COL_V36    VARCHAR2(4000 BYTE),
  COL_V37    VARCHAR2(4000 BYTE),
  COL_V38    VARCHAR2(4000 BYTE),
  COL_V39    VARCHAR2(4000 BYTE),
  COL_V40    VARCHAR2(4000 BYTE),
  COL_V41    VARCHAR2(4000 BYTE),
  COL_V42    VARCHAR2(4000 BYTE),
  COL_V43    VARCHAR2(4000 BYTE),
  COL_V44    VARCHAR2(4000 BYTE),
  COL_V45    VARCHAR2(4000 BYTE),
  COL_V46    VARCHAR2(4000 BYTE),
  COL_V47    VARCHAR2(4000 BYTE),
  COL_V48    VARCHAR2(4000 BYTE),
  COL_V49    VARCHAR2(4000 BYTE),
  COL_V50    VARCHAR2(4000 BYTE),
  QUERY_REF  VARCHAR2(4000 BYTE)
);

这里有什么问题,请帮忙,因为我无法解决这个问题。

如果您想要执行查询的所有列都相同,则需要按升序或降序排列

 select * from 
 (select TABLE_NAME,column_name from all_tab_columns
 where 1=1 
 and 
 table_name='DATA_TEMPLATE_TABLE'
 AND column_name <>'ID'
 AND column_name <>'QUERY_REF'
 order by column_id)
 where rownum<=6;

来自Oracle杂志的一篇文章。。

ROWNUM是查询中可用的伪列(而不是实列)。ROWNUM将被分配数字1、2、3、4。。。N,其中N是ROWNUM使用的集合中的行数。ROWNUM值不会永久分配给一行(这是一个常见的误解)。表中的一行没有数字;你不能从桌子上要第5行——根本没有这样的东西。

同样让许多人感到困惑的是,ROWNUM值的实际分配时间。ROWNUM值在行通过查询的谓词阶段之后,但在查询执行任何排序或聚合之前分配给行。此外,ROWNUM值只有在分配后才会递增,这就是为什么下面的查询

相关内容

最新更新