代码之家  ›  专栏  ›  技术社区  ›  pavanred

查询:查找不属于值列表的行

  •  8
  • pavanred  · 技术社区  · 14 年前

    假设我有一个表'Tab',其中有一列'Col'

    Col
    1
    2
    3
    4
    5
    

    如果我有一组值(2,3,6,7)。我可以通过执行查询来查询表和列表中存在的值

    Select Col from Tab where col IN (2,3,6,7)
    

    但是,如果我想返回列表中不在表中的值,即在本例中仅返回(6,7)。我应该使用什么查询?

    7 回复  |  直到 13 年前
        1
  •  3
  •   Wade73    14 年前

    我认为问题在于你试图从你的陈述中找到价值。您需要做的是将in语句转换成一个表,然后您可以确定哪些值是不同的。

    create table #temp
    (
    value int
    )
    
    insert into #temp values 1
    insert into #temp values 2
    insert into #temp values 3
    insert into #temp values 4
    
    select
     id
    from
     #temp
    where
     not exists (select 1 from Tab where Col = id)
    

    更好的选择是创建一个表值函数,将逗号分隔的字符串转换为表。我手头没有任何代码,但应该很容易在谷歌上找到。在这种情况下,您只需要使用下面的语法。

    select
     id
    from
     dbo.SplitStringToTable('2,3,6,7')
    where
     not exists (select 1 from Tab where Col = id)
    

    希望这有帮助

        2
  •  3
  •   Martin Smith    14 年前

    SELECT N FROM (VALUES(2),(3),(6),(7)) AS D (N)
    EXCEPT
    Select Col from Tab
    

    或SQL Server 2005

    DECLARE @Values XML
    
    SET @Values = 
    '<r>
        <v>2</v>
        <v>3</v>
        <v>6</v>
        <v>7</v>
    </r>' 
    
    
    SELECT 
        vals.item.value('.[1]', 'INT') AS Val
    FROM @Values.nodes('/r/v') vals(item)
    EXCEPT
    Select Col from Tab
    
        3
  •  2
  •   lomaxx    14 年前

    DECLARE @t1 TABLE (i INT) 
    INSERT @t1 VALUES(2) 
    INSERT @t1 VALUES(3)
    INSERT @t1 VALUES(6) 
    INSERT @t1 VALUES(7)
    
    SELECT i FROM @t1 WHERE i NOT IN (Select Col from Tab)
    
        4
  •  0
  •   Madhivanan    14 年前

    一种方法是

    declare @table table(col int)
    insert into @table
    select 1 union all
    select 2  union all
    select 3  union all
    select 4  union all
    select 5 
    
    
    declare @t table(col int)
    insert into @t
    select 2 union all
    select 3 union all
    select 6 union all
    select 7 
    
    select t1.col from @t as t1 left join @table as t2 on t1.col=t2.col
    where t2.col is null
    
        5
  •  0
  •   Community CDub    6 年前

    你的数据库里有[数字]表吗(看到了吗 Why should I consider using an auxiliary numbers table?

    SELECT
        [Tab].*
    FROM
        [numbers]
        LEFT JOIN [Tab]
            ON [numbers].[num] = [Tab].[Col]
    WHERE
        [numbers].[num] IN (2, 3, 6, 7)
        AND [Tab].[Col] IS NULL
    
        6
  •  0
  •   Chris Diver    14 年前

    我认为有很多方法可以做到这一点,这里有一个。

    SELECT a.col 
    FROM 
      (SELECT 2 AS col UNION ALL SELECT 3 UNION ALL SELECT 6 UNION ALL SELECT 7) AS a
    WHERE a.col NOT IN (SELECT col FROM Tab)
    
        7
  •  0
  •   TyT    14 年前

    派对迟到了。。。

    SELECT 
        '2s' = SUM(CASE WHEN Tab.Col = 2 THEN 1 ELSE 0 END),
        '3s' = SUM(CASE WHEN Tab.Col = 3 THEN 1 ELSE 0 END),
        '6s' = SUM(CASE WHEN Tab.Col = 6 THEN 1 ELSE 0 END),
        '7s' = SUM(CASE WHEN Tab.Col = 7 THEN 1 ELSE 0 END)
    FROM
    (SELECT 1 AS Col, 'Nums' = 1 UNION SELECT 2 AS Col,'Nums' = 1 UNION SELECT 3 AS Col,      'Nums' = 1 UNION SELECT 4 AS Col, 'Nums' = 1 UNION SELECT 5 AS Col, 'Nums' = 1 ) AS Tab
    GROUP BY Tab.Nums
    

    顺便说一句,我的也给每个计数,有用的,如果你需要的话。就像你在检查产品清单和你的库存一样。虽然你可以写一个更好的支点,只是不知道如何从我的头顶。