【问题标题】:Not in In SQL statement?不在 In SQL 语句中?
【发布时间】:2024-01-11 23:43:01
【问题描述】:

我在 excel 中设置了大约 5000 的 id,在表中我有大约 30000 的 id。如果我在 SQL 语句中使用“In”条件,我会从 Excel 中的任何 id 中获得大约 4300 个 id。但是,如果我使用带有 Excel id 的“不在”。我有大约 25000 多条记录。我只是想知道我在表格中缺少 Excel id。

这个怎么写sql?

示例: Excel Id 是

 1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
10,

表有 ID

 1,
 2,
 3,
 4,
 6,
 8,
 9,
11,
12,
14,
15

现在我想从 Excel 中获取缺少表格的 5,7,10 值?

更新:

我正在做的是

SELECT  [GLID]      
  FROM [tbl_Detail] 
  where datasource = 'China' and  ap_ID  not in (5206896,
5206897,
5206898,
5206899,
5117083,
5143565,
5173361,
5179096,
5179097,
5179150)

【问题讨论】:

  • 向我们展示您正在使用的 SQL。
  • 你可以使用Except关键字吗?即 select id from table_1(带有 excel ids 的表) EXCEPT select id from table 2(sql 表) 它的工作原理类似于 oracle 中的 MINUS 关键字。

标签: sql sql-server tsql set-difference notin


【解决方案1】:

使用 SQL Server Management Studio 中的导入数据向导将您的 excel 文件导入 SQL Server。

然后您可以编写以下查询来查找文件中但不在表中的任何 ID:

SELECT id     
FROM imported_table
WHERE id NOT IN (SELECT id FROM db_table)

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT    tableExcel.ID
    FROM      tableExcel
    WHERE     tableExcel.ID NOT IN(SELECT anotherTable.ID FROM anotherTable)
    

    这是一个 SQL Fiddle 来试试这个:sqlfiddle.com/#!6/31af5/14

    【讨论】:

      【解决方案3】:

      您应该将 excel 数据移动到 SQL Server 中的表中,然后在 SQL Server 中进行查询。

        select distinct id from Excel where id not in (select your ids from Sqltable)
      

      (显然,从 Sqltable 中选择您的 id 是一种返回 SQL Server 上存在的 Id 的选择)。

      您可能认为将数据移动到 SQL Server 很难,但相反,它非常容易:

      1) 创建表

        CREATE TABLE ExcelIds (Id int)
      

      2) 使用以下公式在 excel 中添加一个新列:

        ="insert into ExcelIds values(" & XX & ")"
      

      其中 XX 是对具有 excel Ids 的列中单元格的引用。

      3) 将 Excel 中的“插入”复制到 SSMS 或您在 SQL Server 中使用的任何工具中,然后执行它们。

      现在您在 SQL Server 中有 2 个表,因此查询它绝对容易。

      结束后,放下桌子

      DROP TABLE ExcelIds
      

      注意:我没有在 SQL Server 表上创建键,因为我认为 Id 可以重复。为避免此临时解决方案的 ExcelId 重复,创建更复杂的 SQL 查询也不合理。

      【讨论】:

        【解决方案4】:

        您可能正在寻找EXCEPT

        SELECT Value 
        FROM @Excel 
        EXCEPT
        SELECT Value 
        FROM @Table;
        

        编辑

        Except

        • 以不同的方式处理 NULL(NULL 值匹配)
        • 申请DISTINCT

        不同于NOT IN

        这是您的示例数据:

        declare @Excel Table(Value int);
        INSERT INTO @Excel VALUES(1);
        INSERT INTO @Excel VALUES(2);
        INSERT INTO @Excel VALUES(3);
        INSERT INTO @Excel VALUES(4);
        INSERT INTO @Excel VALUES(5);
        INSERT INTO @Excel VALUES(6);
        INSERT INTO @Excel VALUES(7);
        INSERT INTO @Excel VALUES(8);
        INSERT INTO @Excel VALUES(9);
        INSERT INTO @Excel VALUES(10);
        
        declare @Table Table(Value int);
        INSERT INTO @Table VALUES(1);
        INSERT INTO @Table VALUES(2);
        INSERT INTO @Table VALUES(3);
        INSERT INTO @Table VALUES(4);
        INSERT INTO @Table VALUES(6);
        INSERT INTO @Table VALUES(8);
        INSERT INTO @Table VALUES(9);
        INSERT INTO @Table VALUES(11);
        INSERT INTO @Table VALUES(12);
        INSERT INTO @Table VALUES(14);
        INSERT INTO @Table VALUES(15);
        

        【讨论】:

        • @LenielMacaferi:没有人怀疑这一点。我已经注意到了差异。例如,将 INSERT INTO @Excel VALUES(7); 添加到我的示例数据中,您会看到您的查询现在将返回 4 条记录(重复“1”),而 except 仍然返回 3 个 DISTINCT 值。所以这取决于要求。
        • @Myself:当然 repeating "1" 是一个错字,应该是 repeating "7" ;)