我正试着弄到一行的一行号。由于表中没有任何id列,所以我使用了ROW_NUMBER(),没有任何顺序,如下所示。
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SNO, *
FROM [table1] 现在的挑战是,我需要找到一个带有条件的行,这个条件只是一个select语句,带有where子句,但是有一个原始行号。
SELECT TOP 1 *
FROM table1
WHERE [Total Sales] = 2555此语句返回单个记录。我尝试使用INTERSECT将这两个语句组合起来,以获得结果和行号。
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS SNO, *
FROM [table1]
INTERSECT
SELECT TOP 1 *
FROM table1
WHERE [Total Sales] = 2555当然,这会引发错误,因为列数不同。那么,获得实际行号的正确方法是什么呢?
发布于 2016-10-10 12:14:02
当您运行此查询时:
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SNO, t.*
FROM [table1] t;SNO值是不稳定的。这意味着同一查询多次运行可能返回不同的数字。SQL中的排序不稳定。这意味着在多次运行查询时,相同的键可以是任意顺序的。为什么?SQL表和结果集表示无序集。没有任何东西可以作为稳定的基础。
对您的问题的简单回答是使用子查询:
SELECT t.*
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SNO, t.*
FROM [table1] t
) t
WHERE [Total Sales] = 2555;但是,真正的答案是,如果您想要对多个查询使用此值,则应该使用多个列来创建一个稳定的排序。
发布于 2016-10-10 16:06:45
SQL没有条目的初始“行号”。显示的表顺序都是基于查询结果的。如果您希望按照将它们放入DB的顺序保存它们,那么可能会添加一个用触发器生成的时间戳,并在插入时附加到行中。然后使用这个时间夯实,你可以让他们按这个分类。
如果没有我的话,主钥匙是什么?
https://stackoverflow.com/questions/39957952
复制相似问题