2015-06-27 77 views
2

我想构建一个姓氏列表,以便从第二个select语句的结果中过滤出类似的内容(不这样做)如何在NOT IN子句中使用select语句中的字符串列表

DECLARE @ExcludedList VARCHAR(MAX) 
SET @ExcludedList = (SELECT TOP 20 Lastname 
FROM dbo.Subscribers 
where [Firstname] = 'Dave') 

SELECT [Firstname], Count([Firstname]) as [Count] from Subscribers 
WHERE [Lastname] not in (@ExcludedList) 

回答

0

如果你需要使用一个变量,那么它必须是一个变量:

DECLARE @ExcludedList TABLE (Lastname VARCHAR(MAX)) 

INSERT INTO @ExcludedList 
SELECT TOP 20 Lastname 
FROM dbo.Subscribers 
WHERE [Firstname] = 'Dave' 

SELECT [Firstname], Count([Firstname]) AS [Count] 
FROM Subscribers 
WHERE [Lastname] NOT IN (SELECT Lastname FROM @ExcludedList) 
0

为什么你不能做到这一点直接像

SELECT [Firstname], Count([Firstname]) as [Count] from Subscribers 
WHERE [Lastname] not in (SELECT TOP 20 Lastname 
FROM dbo.Subscribers where [Firstname] = 'Dave') 

好吧,我不知道你实际上是试图实现,但考虑使用table variable和使用如下

DECLARE @ExcludedList table(lastname varchar(30)); 
insert into @ExcludedList 
SELECT TOP 20 Lastname 
FROM dbo.Subscribers where [Firstname] = 'Dave'; 

SELECT [Firstname], Count([Firstname]) as [Count] from Subscribers 
WHERE [Lastname] not in (select lastname from @ExcludedList); 
+0

那不是我使用的是其更复杂的实际查询,但我想装上去了说明这个问题。我正在使用类似的东西,但它很慢 – Neil

+0

然后尝试发布你正在尝试解决的实际问题。无论如何,如果有帮助,请参阅编辑答案。在这种情况下,您也可以尝试使用表变量。 – Rahul