如何查询不在一组id中的项目 - 清理数据

时间:2012-11-11 02:16:27

标签: sql

比如说我有以下外键ID:

 10437 
 10476 
 13212 
 13215 

我希望找到其中一个已从主表中删除的内容,即这个中缺少哪一个?我该怎么做?我对in语句的某些变体进行了假设。

事先提前

编辑#1

所以重新说一下,我想要一些像:

TABLE
id 
10437 
13215


select something from items where id not in (10437, 10476, 13212, 13215)

would return:
10476 
13212 

这些数字大约是数百个项目,因此只想删除孤立的记录,而不是传统的外键关联,因此外连接不起作用。

3 个答案:

答案 0 :(得分:4)

您可以使用NOT IN谓词,如下所示:

SELECT *
FROM YourTableName
WHERE ReferenceId NOT IN(10437, 10476, 13212, 13215);

SQL Fiddle Demo

更新:如果您希望ID存在,请使用IN谓词:

SELECT *
FROM YourTableName 
WHERE ReferenceId IN (10437, 10476, 13212, 13215);

SQL Fiddle Demo

<击>

更新2:要清除此问题,您需要表格中不存在的ID列表中的ID列表。这是同样的想法,但另一种方式

SELECT FROM (list of ids) WHERE id NOT IN (SELECT referenceid from Table);

不是这个:

SELECT FROM Table WHERE id not in (list of ids ) will give you the other list;

因为这将从表中提供id列表,而不是id列表。

你可以这样做:

SELECT *
FROM 
( 
    SELECT 10437 id
    UNION ALL
    SELECT 10476
    UNION ALL
    SELECT 13212
    UNION ALL
    SELECT 13215
) t1
WHERE id NOT IN (SELECT referenceid FROM YourTableName);

RIGHT JOIN如此:

SELECT t2.Id
FROM YourTableName t1 
RIGHT JOIN
( SELECT 10437 id
  UNION ALL
  SELECT 10476
  UNION ALL
  SELECT 13212
  UNION ALL
  SELECT 13215
 ) t2 ON t1.ReferenceID = t2.id
WHERE t1.referenceid IS NULL;

SQL Fiddle Demo

两者都应该返回:

10476 
13212 

答案 1 :(得分:2)

select * from your-table where id not in (your-list-of-ids)

根据您使用的数据库your-list-of-ids,可以是嵌套查询,如:

select id from your-other-table

更清晰

select id from your-primary-table为您提供主表中的所有ID。

select * from your-secondary-table where foreign_key_id not in (select id from your-primary-table)

为您提供辅助表中的行,其主键在主表中不再存在。

答案 2 :(得分:0)

select t1.foreign_key_field from table_with_foreign_key as t1 
left join table_with_primary_key as t2 on t2.id = t1.foreign_key_field 
where  t2.id is null

语法取决于sql dialect