2012-03-17 107 views
3

我需要在下面的查询中使用ROW_NUMBER()来返回结果的第5到10行。任何人都可以告诉我我需要做什么?我一直在努力没有用。如果有人可以帮助,我会非常感激。SQL ROW_NUMBER with INNER JOIN

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

这看起来有点家庭作业-y-你有什么*尝试*?它是否导致错误? “错”结果?你显然*已经知道'ROW_NUMBER'是执行分页的正确功能... – 2012-03-17 17:57:03

+0

@Damien_The_Unbeliever他提供了查询。对不起,只是想要合理。这是一个有效的问题。 – 2012-09-27 12:41:18

回答

10

您需要将其粘贴在表格表达式中才能过滤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 
+0

其实你可以使用*:[[SELECT ROW_NUMBER()OVER(ORDER BY ...)AS [RN],* FROM ...]] – Learner 2013-04-15 07:37:24

+0

...但是当然,不推荐使用*不推荐 – Learner 2013-04-15 07:51:43

+0

@ Cristi - 他们不能使用'*'的原因是因为列名'starRating'出现在CTE中的两个表和列名中必须是唯一的。 – 2013-04-15 08:14:51

0

您可以使用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; 
+0

这一个带回了结果。谢谢!我有一个问题...我可以从ASP执行此操作吗?我已经尝试添加到我的页面代码与标准的“oDatabase.SQL =”与t AS(SELECT ...“,但它不返回任何行,我是否错过了什么?如果这是一个愚蠢的问题,道歉 – 2012-03-17 18:24:32

+0

@JasonEyebe对不起,我根本不熟悉ASP。 – 2012-03-17 18:25:30