基于 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 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章
查询性能:CTE 使用 ROW_NUMBER() 选择第一行