首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在select语句上获取一个行号,同时匹配整行

在select语句上获取一个行号,同时匹配整行
EN

Stack Overflow用户
提问于 2016-10-10 12:08:20
回答 2查看 1.3K关注 0票数 0

我正试着弄到一行的一行号。由于表中没有任何id列,所以我使用了ROW_NUMBER(),没有任何顺序,如下所示。

代码语言:javascript
复制
SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SNO, * 
FROM [table1] 

现在的挑战是,我需要找到一个带有条件的行,这个条件只是一个select语句,带有where子句,但是有一个原始行号。

代码语言:javascript
复制
SELECT TOP 1 * 
FROM table1 
WHERE [Total Sales] = 2555

此语句返回单个记录。我尝试使用INTERSECT将这两个语句组合起来,以获得结果和行号。

代码语言:javascript
复制
SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO, * 
FROM [table1] 

INTERSECT 

SELECT TOP 1 *
FROM table1
WHERE [Total Sales] = 2555

当然,这会引发错误,因为列数不同。那么,获得实际行号的正确方法是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-10 12:14:02

当您运行此查询时:

代码语言:javascript
复制
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SNO, t.*
FROM [table1] t;

SNO值是不稳定的。这意味着同一查询多次运行可能返回不同的数字。SQL中的排序不稳定。这意味着在多次运行查询时,相同的键可以是任意顺序的。为什么?SQL表和结果集表示无序集。没有任何东西可以作为稳定的基础。

对您的问题的简单回答是使用子查询:

代码语言:javascript
复制
SELECT t.*
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SNO, t.*
      FROM [table1] t
     ) t
WHERE [Total Sales] = 2555;

但是,真正的答案是,如果您想要对多个查询使用此值,则应该使用多个列来创建一个稳定的排序。

票数 4
EN

Stack Overflow用户

发布于 2016-10-10 16:06:45

SQL没有条目的初始“行号”。显示的表顺序都是基于查询结果的。如果您希望按照将它们放入DB的顺序保存它们,那么可能会添加一个用触发器生成的时间戳,并在插入时附加到行中。然后使用这个时间夯实,你可以让他们按这个分类。

如果没有我的话,主钥匙是什么?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39957952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档