2012-03-17 6 views
3

Мне нужно использовать ROW_NUMBER() в следующем запросе, чтобы возвращать строки с 5 по 10 результата. Может ли кто-нибудь показать мне, что мне нужно сделать? Я пытался безрезультатно. Если кто-то может помочь, я бы очень признателен.SQL ROW_NUMBER с 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

Это выглядит немного домашнее задание-у - что вы * попробовали *? Это привело к ошибке? «Неверные» результаты? Вы, видимо, уже знаете, что 'ROW_NUMBER' является правильной функцией для выполнения подкачки ... –

+0

@Damien_The_Unbeliever он предоставил запрос. Извините, но просто хочу быть разумным. Это правильный вопрос. –

ответ

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

+0

... но, конечно, в общем использовании * не рекомендуется – Learner

+0

@ Cristi - Причина, по которой они не могут использовать '*', заключается в том, что имя столбца «starRating» появляется в обеих таблицах, а имена столбцов в CTE должны быть уникальными. –

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 =» WITH t AS (SELECT ... », но не возвращал никаких строк. Я что-то упускаю? Извинения, если это глупый вопрос –

+0

@JasonEyebe Извините, но я вообще не знаком с ASP. –