SQL Server - 需要根据嵌套排名获取数据

时间:2010-07-20 20:20:35

标签: sql-server sql-server-2005 tsql

我们有一个功能允许我们创建SQL以基于嵌套查询从一个表中获取数据,该嵌套查询根据来自另一个表的匹配条件过滤记录。现在,我们需要能够根据nexted查询的前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不起作用,因为如果任何字段匹配,所有存在的都返回“TRUE”(即使我们放置返回主查询的链接)。有谁知道我怎么能让这个工作?感谢。

2 个答案:

答案 0 :(得分:2)

您想加入嵌套查询。我已经对适当的连接条件做了一个假设,但它会是这样的:

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

答案 1 :(得分:0)

我也不确定连接条件。在Customer_LocationCustomerID上匹配似乎出乎意料。也许你可以澄清一下?

我认为您需要一个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)