2010-07-20 54 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