Sql 如何查找记录的行号?

Sql 如何查找记录的行号?,sql,sql-server,Sql,Sql Server,考虑下表中的示例 ProductDetailNo ProductDescription 224 Apples 225 Tomatoes 226 Potatoes 如何列出所选行的行号,如下图所示 RowNo ProductDetailNo Product Description 2 225

考虑下表中的示例

ProductDetailNo    ProductDescription
      224                Apples
      225                Tomatoes
      226                Potatoes
如何列出所选行的行号,如下图所示

RowNo    ProductDetailNo          Product Description
  2         225                Tomatoes
无论数据库中的逻辑行是什么,在查询中使用row_number()只会为单个记录返回1 always

谢谢,达米恩。

试试这个

WITH MyTable AS
(
    SELECT ProductDetailNo, ProductDescription,
    ROW_NUMBER() OVER ( ORDER BY ProductDetailNo ) AS 'RowNumber'
    FROM Product
) 
SELECT RowNumber, ProductDetailNo     
FROM MyTable 
WHERE ProductDetailNo = 225

您收到的行号来自结果的行数。i、 如果结果只有一个元组,则行号将始终为1

要获取整个表的行号,您应该向表中添加一个额外的属性,RowNo,并自动递增

希望这有帮助,但SQL可能会为您提供更好的解决方案

这个怎么样

SELECT RowNo, ProductDetailNo, ProductDescription
FROM (SELECT ROW_NUMBER() as RowNo, ProductDetailNo, ProductDescription
      FROM TheTable) as t
WHERE ProductDetailNo = 225;

表行没有固有的行号
ROW_NUMBER()
只提供特定结果集中的行号。因此,当结果集仅包含1条记录时,您总是会得到
1
。如果您想要一个行号,那么您的表架构应该包括类似于自动递增的
标识列的内容。

请检查此项

WITH ArticleSearch AS
    (
        SELECT
            ROW_NUMBER() OVER 
                (
                    ORDER BY tblProducts.ProductDetailNo                                    
                ) AS RowNumber, 
            tblProducts.ProductDetailNo, 
            tblProducts.ProductDescription    
        FROM         
            tblProducts
    )

    SELECT 
        a.RowNumber AS SlNo,
        a.ProductDetailNo,
        a.ProductDescription
    FROM
          ArticleSearch a
    WHERE
          a.ProductDetailNo=225

row_number()获取查询结果并对其进行编号。如果查询只返回一行,则行号()将始终为1。谢谢你的信息,布兰登,但一定有办法,一定有办法。向查询的表添加(或使用)唯一键,并使用唯一键反向引用结果。如果ProductDetailNo是唯一的,您也可以将其用作反向引用。您是在谈论标识字段吗?数据库中的行是无序的一组或多行,您可以在查询中使用
order by
进行排序。因此,没有“逻辑”行号可供查询。您想对行号做什么?也许还有其他方法可以做你想做的事。试试这个。这将只返回一行,它将包含最后一列Rownumber,该列将在正在工作的数据中显示其行号,但内部选择将对所有记录运行,因为where子句在外部。是的,内部选择将对所有记录运行,因为我们需要每个记录的行号。然后,我们可以使用外部查询筛选结果,因为行号实际上是在运行时创建的。这就是为什么我们需要内部选择。。如果需要其他方法,则必须创建一些触发器,将行号存储在列中,以便在运行时无需对行进行编号即可轻松获得结果。@DamienJoe-内部选择可能必须访问或不必访问所有行-它肯定需要确定将分配的行号,但是它可以通过其他方式来确定-SQL的全部要点是告诉它你想要什么,而不是如何做,然后它尝试确定最佳的方法。感谢Vinyak,我不知道下一票是为了什么,但我仍然希望有一些SQL magic=)这很好,但内部查询将对表中的所有行运行。你有其他的解决办法吗?嗯,为了给事情编号,你必须知道所有的事情。这是解决您当前问题的最佳解决方案。当然,
ROW_NUMBER()
返回的值在每次执行此查询时可能不同,如果没有
ORDER by
(这是否有效?)是,没有
ORDER by
,返回记录的顺序未定义。嘿,内部选择将对所有记录运行?嘿,Bobby,SQL有一种方法。
  WITH productCTE 
  AS
  (SELECT ROW_NUMBER() OVER(ORDER BY ProductDetailNo, ProductDescription) AS RowNo, ProductDetailNo, ProductDescription
   FROM tbl_Products
  )
  SELECT * FROM productCTE
  WHERE RowNo = 2