当前位置: 首页 > 知识库问答 >
问题:

由具有ROWNUM和主键列的查询返回的行

孟文栋
2023-03-14

我正在阅读大约1个oracle伪目录,即ROWNUM:它的返回编号指示oracle返回行的顺序。

我在这里遇到了一些行为,

示例1。创建脚本:

CREATE TABLE CUSTOMERS(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   SALARY   DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

2插入html" target="_blank">脚本:

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Max', 22, 'India', 4500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Maths', 22, 'US', 4500.00 );

从客户中选择*;按照上述插入的相同顺序执行,

ID      NAME AGE ADDRESS SALARY 
------  ---- --- ------- ------
2       Max  22  India  4500.00

1       Math 22  US     4500.00

在这里,如果我运行选择查询,

select 
rownum,
customers.ID
from customers;

我得到以下输出:

ROWNUW  ID
------  --
1       1

2       2

这里ID=2首先插入,但oracle返回第二行,

但是,如果您包含具有ROWNUM和PK的表中的任何其他列,例如

select 
rownum,
customers.ID,customers.Name
from customers;

我得到了正确的输出(正确的插入顺序):

ROWNUW  ID NAME
------  -- ----
1       2  Max

2       1  Math 

如果运行查询没有Name列,即只有ROWNUW(伪olumns)和PK(表列)

我们得到了这个,

ROWNUW  ID
------  --
1       1

2       2

我的问题是为什么ID=2不是第一个返回的行。

如果我使用ROWNUM查询任何表列,我将根据插入顺序返回结果。

下面的示例

select 
    rownum,
(NAME / AGE  / ADDRESS  SALARY) any one of these columns
From CUSTOMERS

但如果将ROWNUM与ID(主键列)一起使用,则插入顺序不起作用。为什么这种行为只有主键列?

共有2个答案

束新
2023-03-14

Rownum始终按1,2,3,4的顺序排列。。无论你在结果集中得到什么。它总是在查询返回结果集后计算。

现在,您有ID列作为PRIMARY KEY,这使得它有资格在数据库中创建默认聚集索引。因此,当您只选择PRIMARY列时,它将按照存储在数据库中的方式进行排序。作为PRIMARY键创建的结果创建的索引在ASC中进行排序,这是默认的。

在这里,如果您只选择主键列,即“ID”,则数据库将按排序顺序返回它,ROWNUM将写入1

但是,如果您也选择了一些额外的非PRIMARY KEY,那么它完全取决于oracle,无论它以哪种方式更快地找到数据。有时它会从缓存中返回数据。如果不是,它会读取磁盘并获取数据。在读取数据文件时,机器与机器之间会有多种不同之处,即您的表是否分区?您的表是否共享表空间?您在表中使用什么组织?等等...

底线是,不要相信ROWNUM。在您将大脑应用于查询后,它会给出1,2,3...。

阎唯
2023-03-14

ROWNUM值取决于oracle访问结果集的方式。获取结果集后,将rownum分配给行。

由于无法保证返回数据的顺序,因此无法保证指定的rownum的顺序。

也许如果您尝试在没有rowna的情况下运行两个查询,您可能会像显示的那样交换行,或者它们可能不会。

 类似资料:
  • 我保留了一份按“顺序”排列的产品清单。当我试着从房间里拿一份产品清单的时候。我得到以下错误。但我做了一个TypeConvertor。会有什么错误呢? 订单 产品 命令道 转换器 错误 java:53:错误:查询返回的列在com.vepe.navigation.model.entity.product中没有字段[id,orderId,name,pathImage,price,priceDiscoun

  • 我正在实现房间数据库。这是我的POJO类 这是DAO类 在运行我的代码时,我收到以下错误

  • 我正在尝试使用分区键和排序键查询Dynamodb表。排序键是unix日期,因此我想在排序中请求这2个日期之间的x分区键。我目前可以通过表扫描来实现这一点,但为了提高速度,我必须将其移至查询。我在网上找不到人们使用分区键和排序键查询他们的表的任何像样的例子。 我仔细阅读了这篇文章https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#

  • 问题内容: 如何获取使用SQL Server的SQL查询返回的列数? 例如,如果我有如下查询: 它应该返回表A1中的总列数+表A2中的总列数。但是查询可能会更复杂。 问题答案: 这是一种方法: 您可以通过创建视图来执行类似的操作。

  • 本文向大家介绍MySQL查询返回TRUE为具有正值的行?,包括了MySQL查询返回TRUE为具有正值的行?的使用技巧和注意事项,需要的朋友参考一下 要为正值返回TRUE,为负返回FALSE,请使用MySQL IF()。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是对具有正值的行返回true的查询- 这将产生以下输出-

  • 我有一个遗留数据库(实际上是Cobol文件),我正在使用Hibernate/JPA的专有JDBC驱动程序访问它。 实体有一个包含2列的复合主键:和。 在遗留数据中有相同的记录,这些记录可以具有的特定值,也可以在表示'All Sites'的列中具有NULL的记录。该文件的理论是,如果您找不到特定的SITE的,那么您可以在中使用NULL查找记录(the'catk-all')。 我不能改变这个“表”的结