SQL ROW_NUMBER与INNER JOIN

5

我需要在以下查询中使用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 

1
这看起来有点像作业 - 你尝试过什么?它导致了错误吗?结果是“错误”的吗?显然,您已经意识到ROW_NUMBER是执行分页的正确函数... - Damien_The_Unbeliever
@Damien_The_Unbeliever已经提供了查询。抱歉,我只是想合理一些。这是一个有效的问题。 - TheTechGuy
2个回答

11

您需要将其放入表达式中才能对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 ...]] - Learner
@Cristi - 他们不能使用 * 的原因是因为列名 starRating 在两个表中都出现了,而且 CTE 中的列名必须是唯一的。 - Martin Smith
抱歉,我没有注意到那个,对不起! - Learner

1
您可以使用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...” 将其添加到我的页面代码中,但它没有返回任何行。是我漏掉了什么吗?如果这是一个愚蠢的问题,请原谅。 - Jason Eyebe
@JasonEyebe 抱歉,我对ASP一点也不熟悉。 - Chetter Hummin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接