【问题标题】:SQL ROW_NUMBER with INNER JOIN带有 INNER JOIN 的 SQL ROW_NUMBER
【发布时间】:2012-04-02 21:17:29
【问题描述】:

我需要在以下查询中使用 ROW_NUMBER() 来返回结果的第 5 到 10 行。谁能告诉我我需要做什么?我一直在尝试无济于事。如果有人可以提供帮助,我将不胜感激。

SELECT * 
FROM   villa_data 
       INNER JOIN villa_prices 
         ON villa_prices.starRating = villa_data.starRating 
WHERE  villa_data.capacity >= 3 
       AND villa_data.bedrooms >= 1 
       AND villa_prices.period = 'lowSeason' 
ORDER  BY villa_prices.price, 
          villa_data.bedrooms, 
          villa_data.capacity 

【问题讨论】:

  • 这看起来有点功课-y - 你有什么尝试?是否导致错误? “错误”的结果?您显然已经知道ROW_NUMBER 是执行分页的正确函数...
  • @Damien_The_Unbeliever 他提供了查询。对不起,只是想讲道理。这是一个有效的问题。

标签: sql sql-server row-number


【解决方案1】:

您需要将其粘贴在表格表达式中以过滤ROW_NUMBER。您将无法使用*,因为它会抱怨列名starRating 出现多次,因此需要明确列出所需的列。无论如何,这是更好的做法。

WITH CTE AS
(
SELECT /*TODO: List column names*/
       ROW_NUMBER() 
          OVER (ORDER BY villa_prices.price, 
                         villa_data.bedrooms, 
                         villa_data.capacity) AS RN
FROM   villa_data 
       INNER JOIN villa_prices 
         ON villa_prices.starRating = villa_data.starRating 
WHERE  villa_data.capacity >= 3 
       AND villa_data.bedrooms >= 1 
       AND villa_prices.period = 'lowSeason' 

)
SELECT /*TODO: List column names*/
FROM CTE
WHERE RN BETWEEN 5 AND 10
ORDER BY RN

【讨论】:

  • 其实你可以使用 * : [[ SELECT ROW_NUMBER() OVER (ORDER BY ...) AS [RN], ​​ FROM ...]]
  • @Cristi - 他们不能使用 * 的原因是因为列名 starRating 出现在两个表中,并且 CTE 中的列名必须是唯一的。
  • 哎呀,没注意,抱歉!
【解决方案2】:

您可以使用 with 子句。请尝试以下方法

WITH t AS
(
SELECT villa_data.starRating, 
   villa_data.capacity,
   villa_data.bedrooms,
   villa_prices.period,
   villa_prices.price,
   ROW_NUMBER() OVER (ORDER BY villa_prices.price, 
      villa_data.bedrooms, 
      villa_data.capacity ) AS 'RowNumber'
FROM   villa_data 
   INNER JOIN villa_prices
     ON villa_prices.starRating = villa_data.starRating 
WHERE  villa_data.capacity >= 3 
   AND villa_data.bedrooms >= 1 
   AND villa_prices.period = 'lowSeason' 
)
SELECT * 
FROM t 
WHERE RowNumber BETWEEN 5 AND 10;

【讨论】:

  • 这个带回了一个结果。谢谢!我有一个问题...我可以从 ASP 执行此操作吗?我已经尝试使用标准的“oDatabase.SQL =”WITH t AS (SELECT...”将它添加到我的页面代码中,但它没有返回任何行。我错过了什么吗?如果这是一个愚蠢的问题,请道歉
  • @JasonEyebe 抱歉,我对 ASP 一点也不熟悉。
猜你喜欢
  • 2012-01-25
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2012-05-23
相关资源
最近更新 更多