SQL Server - необходимо получить данные обратно на основе вложенного ранга - PullRequest
1 голос
/ 21 июля 2010

У нас есть функция, которая позволяет нам создавать SQL для возврата данных из одной таблицы на основе вложенного запроса, который фильтрует записи на основе критериев соответствия из другой таблицы.Теперь нам нужно иметь возможность получать данные из первой таблицы на основе верхних x записей следующего запроса, а не всех соответствующих записей.Например, мы хотим что-то вроде

SELECT Name, Address, City, State, Zip 
  FROM CUSTOMERS
 WHERE Customer_Location IN (SELECT TOP 100 
                                    CustomerID, 
                                    Rank() OVER PARTITION BY TID ORDER BY TerritoryName DESC) AS 'RANK'
                               FROM Territories
                              WHERE Nation = 'Canada')

Но использование оператора IN пока бесполезно, потому что мы можем вернуть только один столбец, а использование EXISTS не работает, поскольку все, что существует, - это возврат«ИСТИНА», если какие-либо поля совпадают (даже когда мы возвращаем ссылку на основной запрос).Кто-нибудь знает, как я могу заставить это работать?Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Вы хотите присоединиться к вашему вложенному запросу. Я сделал предположение о подходящем условии соединения, но это будет что-то вроде:

SELECT Name, Address, City, State, Zip 
FROM CUSTOMERS C
INNER JOIN (SELECT TOP 100 CustomerID, TerritoryName, 
            Rank() OVER PARTITION BY TID ORDER BY TerritoryName DESC) AS 'RANK'
            FROM Territories
            WHERE Nation = 'Canada') T
ON C.Customer_Location = T.TerritoryName
0 голосов
/ 21 июля 2010

Я тоже не уверен насчет условия соединения.Кажется неожиданным совпадение на Customer_Location и CustomerID.Может быть, вы можете уточнить?

Я думаю, вам понадобится CTE или производная таблица.

WITH R AS
(
SELECT CustomerID, 
Rank() OVER (PARTITION BY TID ORDER BY TerritoryName DESC) AS [rank]
FROM Territories
WHERE Nation = 'Canada'
)


SELECT Name, Address, City, State, Zip 
  FROM CUSTOMERS
 WHERE Customer_Location IN (SELECT CustomerID FROM R WHERE [rank] <= 100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...