假设我有一个表,其中有许多行由唯一ID标识。现在我有一个(相当大的)用户输入的id列表(不一个表)我想检查它们已经在数据库中。
所以我想输出列表中的ID,但不输出表格中的ID。我如何用SQL做到这一点?
编辑:我知道我可以用临时表来做到这一点,但如果可能,我真的想避免这种情况。
编辑:使用外部编程语言的注释相同。
答案 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)
你没有提到:
所以我会考虑使用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。