0

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

所以我想输出列表中的 id,而不是表中的 id。我如何用 SQL 做到这一点?

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

编辑:使用外部编程语言的相同评论。

4

3 回答 3

5

试试这个:

SELECT t1.id FROM your_list t1
LEFT JOIN your_table t2
  ON t1.id = t2.id
WHERE t2.id IS NULL
于 2012-04-10T10:49:16.143 回答
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用来避免不必要的排序步骤。

于 2012-04-10T10:58:55.083 回答
1

It is hardly possible to make a single pure and general SQL query for your task, since it requires to work with a list (which is not a relational concept and standard set of list operations is too limited). For some DBMSs it is possible to write a single SQL query, but it will utilize SQL dialect of the DBMS and will be specific to the DBMS.

于 2012-04-10T13:06:36.267 回答