SQL:你如何寻找缺少的ID?

时间:2012-04-10 10:46:41

标签: sql database

假设我有一个表,其中有许多行由唯一ID标识。现在我有一个(相当大的)用户输入的id列表(一个表)我想检查它们已经在数据库中。

所以我想输出列表中的ID,但不输出表格中的ID。我如何用SQL做到这一点?

编辑:我知道我可以用临时表来做到这一点,但如果可能,我真的想避免这种情况。

编辑:使用外部编程语言的注释相同。

3 个答案:

答案 0 :(得分:5)

试试这个:

SELECT t1.id FROM your_list t1
LEFT JOIN your_table t2
  ON t1.id = t2.id
WHERE t2.id IS NULL

答案 1 :(得分:1)

你没有提到:

  • 将使用哪个RDBMS;
  • ID的来源是什么。

所以我会考虑使用PostgreSQL,并将要检查的ID加载到(临时)表中。

请考虑以下事项:

CREATE TABLE test (id integer, value char(1));
INSERT INTO test VALUES (1,'1'), (2,'2'), (3,'3');

CREATE TABLE temp_table (id integer);
INSERT INTO temp_table VALUES (1),(5),(10);

你可以得到这样的结果:

SELECT * FROM temp_table WHERE NOT EXISTS (
    SELECT id FROM test WHERE id = temp_table.id);

SELECT * FROM temp_table WHERE id NOT IN (SELECT id FROM test);

SELECT * FROM temp_table LEFT JOIN test USING (id) WHERE test.id IS NULL;

您可以选择任何选项,具体取决于您的音量,您可能会有不同的表现。

请注意:某些RDBMS可能对IN()构造内部指定的表达式数量有限制,请记住这一点(我用ORACLE多次打了这个)。

编辑:为了匹配无临时表无外部语言的约束,您可以使用以下结构:

SELECT DISTINCT b.id
  FROM test a RIGHT JOIN (
       SELECT 1 id UNION ALL
       SELECT 5 UNION ALL
       SELECT 10) b ON a.id=b.id
 WHERE a.id IS NULL;

不幸的是,你必须生成很多SELECT x UNION ALL条目来制作单列和多行表。我使用UNION ALL来避免不必要的排序步骤。

答案 2 :(得分:1)

几乎不可能为您的任务创建单个纯SQL和常规SQL查询,因为它需要使用列表(这不是关系概念,标准列表操作集太有限)。对于某些DBMS,可以编写单个SQL查询,但它将使用DBMS的SQL方言,并且将特定于DBMS。