2010-07-20 53 views
1

我们有一项功能,允许我们创建SQL以基于嵌套查询从一个表中取回数据,该查询根据来自另一个表的匹配条件过滤记录。现在,我们需要能够根据nexted查询的前x个记录从第一个表中取回数据,而不是所有匹配的记录。例如,我们要像SQL Server - 需要根据嵌套级别返回数据

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 “如果任何字段匹配(即使我们把链接放回主查询)。有谁知道我可以如何让这个工作?谢谢。

+0

我不是很清楚你在这里要做什么。你的问题说你不能使用'IN',但在你明确给出的例子中可以。你正在计算'Rank',但是这对'TOP'没有影响。你正在匹配'Customer_Location'和'CustomerID',这看起来很奇怪。这是您的实际查询还是您在发布之前对其进行了过于简单的说明? – 2010-07-20 21:11:04

回答

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 
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) 
+0

上面发布的SQL的主要内容是这是我们要运行的查询类型的一个例子。 IN语句的问题是,在SQL Server中,我只能使用辅助查询(在IN的括号内)返回单个列,所以在包含SQL的情况下,它不起作用,而且EXISTS本质上会让全局查询忽略辅助查询,除非它返回一个空集,在这种情况下,第一个查询将返回一个空集。 – 2010-07-20 23:08:47

+0

他想从Territory中拉出比CustomerID更多的列...您的查询不提供此功能。 – ErikE 2010-07-20 23:44:41

+0

@Emtucifor - 将它转换为JOIN并不重要。它基于我已经在评论中查询过的OP代码。 – 2010-07-20 23:48:27