【问题标题】:How can I use a string list from a select statement in a NOT IN clause如何在 NOT IN 子句中使用 select 语句中的字符串列表
【发布时间】:2015-06-27 17:25:07
【问题描述】:

我想构建一个姓氏列表,以便从第二个 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) 

【问题讨论】:

    标签: sql-server select dynamic declare


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      为什么不能像这样直接做

      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); 
      

      【讨论】:

      • 这不是我使用的实际查询,它更复杂,但我想提出一些问题来说明这个问题。我正在使用类似的东西,但速度很慢
      • 然后尝试发布您要解决的实际问题。无论如何,如果有帮助,请参阅答案中的编辑。在这种情况下,您也可以尝试使用表变量。
      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多