【问题标题】:SQL Query based on ROW_Number not working基于 ROW_Number 的 SQL 查询不起作用
【发布时间】: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 示例

标签: sql sql-server tsql analytic-functions


【解决方案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 是派生表/内联视图的表别名。有人称其为子查询,但术语含糊。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2013-08-20
相关资源
最近更新 更多