基于 ROW_Number 的 SQL 查询不起作用

Posted

技术标签:

【中文标题】基于 ROW_Number 的 SQL 查询不起作用【英文标题】:SQL Query based on ROW_Number not working 【发布时间】:2010-11-18 18:46:44 【问题描述】:

基本上,我正在尝试对仅包含图像的页面进行查询。我需要提供tripID 号码,然后提供ROWID(因为可能有多个图像)来接收单个图像。我会一直循环,直到每张图片都在 html 中对应的图片框中。

此代码似乎不起作用(我得到 Invalid column name 'ROWID'),但如果我删除 AND ROWID='1' 它会返回所有图像及其行 ID,如下所示:

ROWID      PHOTO
    1      32jjr3h2jh23hj4h32jh42ll23j42 
    2       HU8308DJAOID9ASIDJI32C89EE29

-

Select ROW_NUMBER() OVER (ORDER BY Photo ASC) AS ROWID, TBL_Photo.Photo
        From TBL_Photo
        left join TBL_TripDetails
        ON TBL_Photo.TripID=TBL_TripDetails.pkiTripID
        Where pkiTripID = '121' AND ROWID = '1'

【问题讨论】:

它不工作?返回什么 - 没有行?而且,当你从 where 子句中排除 ROWID 条件时,会查询到什么? 我得到无效的列名“ROWID”。如果排除 ROWID 条件,则查询出 ROWID 和 PHOTO 示例 【参考方案1】:

您不能在 WHERE 子句中引用列别名——您需要使用子查询或 CTE:

子查询示例:

SELECT x.rowid,
       x.photo
  FROM (SELECT ROW_NUMBER() OVER (ORDER BY p.photo) AS ROWID, 
               p.photo
          FROM TBL_PHOTO p
     LEFT JOIN TBL_TRIPDETAILS td ON td.pkitripid = p.tripid 
         WHERE td.pkiTripID = '121') x
 WHERE x.rowid = 1

CTE 示例:

WITH example AS (
        SELECT ROW_NUMBER() OVER (ORDER BY p.photo) AS ROWID, 
               p.photo
          FROM TBL_PHOTO p
     LEFT JOIN TBL_TRIPDETAILS td ON td.pkitripid = p.tripid 
         WHERE td.pkiTripID = '121')
SELECT x.rowid,
       x.photo
  FROM example x
 WHERE x.rowid = 1

性能

这两个选项之间没有性能差异,但并非所有数据库都支持 WITH 语法。

【讨论】:

子查询效果很好,只是想弄清楚它是如何工作的... x 是您的子查询的对象,您可以选择它的属性..? @Spooks: x 是派生表/内联视图的表别名。有人称其为子查询,但术语含糊。

以上是关于基于 ROW_Number 的 SQL 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

手动指定 Row_Number() 的起始值

sql 查询与 Row_Number 不同

查询性能:CTE 使用 ROW_NUMBER() 选择第一行

ROW_NUMBER() Sql 错误

如何在 Access 查询中显示行号,如 SQL 中的 ROW_NUMBER

SQL分页查询,纯Top方式和row_number()解析函数的使用及区别