2010-07-20 3 views
1

У нас есть функция, которая позволяет нам создавать SQL для возврата данных из одной таблицы на основе вложенного запроса, который фильтрует записи на основе критериев соответствия из другой таблицы. Теперь нам нужно иметь возможность возвращать данные из первой таблицы на основе верхних х записей следующего запроса, а не всех соответствующих записей. Для примера мы хотим что-то вроде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 не работает, как все существует делает возвращение «ИСТИНА «если какие-либо поля совпадают (даже если мы вернем ссылку на основной запрос). Кто-нибудь знает, как я могу заставить это работать? Благодарю.

+0

Я не совсем понимаю, что вы пытаетесь сделать здесь. В вашем вопросе говорится, что вы не можете использовать 'IN', но в примере, который вы дали вам ясно. Вы вычисляете «Ранг», но это не повлияет на «TOP». Вы сопоставляете 'Customer_Location' и' CustomerID', которые кажутся странными. Это ваш фактический запрос или вы сделали некоторые упрощения до публикации? –

ответ

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

Главное, что я написал выше, это пример типа запросов, которые мы будем запускать. Проблема с инструкцией IN заключается в том, что в SQL Server я могу получить только вторичный запрос (внутри круглых скобок для IN), который возвращает один столбец, поэтому в случае включенного SQL я бы не работал, и СУЩЕСТВУЮЩИЕ, по существу, дают карт-бланш игнорировать вторичный запрос, если он не возвращает пустой набор, в этом случае первый запрос возвращает пустой набор. –

+0

Он хочет вытащить больше столбцов из территорий, чем CustomerID ... ваш запрос не предлагает этого. – ErikE

+0

@Emtucifor - Было бы тривиально преобразовать его в JOIN. Он был основан на коде OP, который я уже запросил в комментарии. –

Смежные вопросы