SQL ROW_NUMBER с INNER JOIN - PullRequest
       1

SQL ROW_NUMBER с INNER JOIN

3 голосов
/ 17 марта 2012

Мне нужно использовать 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 

Ответы [ 2 ]

10 голосов
/ 17 марта 2012

Вам нужно вставить его в табличное выражение для фильтрации по 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 голосов
/ 17 марта 2012

Вы можете использовать с предложением. Пожалуйста, попробуйте следующее

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;
...