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

Sql 如何查询不在一组id中的项目-清理数据,sql,Sql,例如,假设我有以下外键ID: 10437 10476 13212 13215 我想找到其中一个已经从主表中删除了,也就是说,这个集合中缺少了哪一个?我该怎么做?我在陈述中加入了一些变化 提前thx 编辑1 因此,为了重新表述上述内容,我想要一些东西,比如: TABLE id 10437 13215 select something from items where id not in (10437, 10476, 13212, 13215) would return:

例如,假设我有以下外键ID:

 10437 
 10476 
 13212 
 13215 
我想找到其中一个已经从主表中删除了,也就是说,这个集合中缺少了哪一个?我该怎么做?我在陈述中加入了一些变化

提前thx

编辑1

因此,为了重新表述上述内容,我想要一些东西,比如:

TABLE
id 
10437 
13215


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

would return:
10476 
13212 
数字的顺序是数百项,因此只需删除孤立记录,而这不是传统的外键关系,因此外部联接将不起作用。

您可以像这样使用not IN谓词:

SELECT *
FROM YourTableName
WHERE ReferenceId NOT IN(10437, 10476, 13212, 13215);
更新:如果希望Id存在,请使用IN谓词:

SELECT *
FROM YourTableName 
WHERE ReferenceId IN (10437, 10476, 13212, 13215);
更新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);
或者使用这样的右连接:

双方应返回:

10476 
13212 
根据您使用的数据库,ID列表可以是嵌套查询,如:

从其他表中选择id

更清楚

从主表中选择id将提供主表中的所有id

select * from your-secondary-table where foreign_key_id not in (select id from your-primary-table)
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
提供辅助表中外键在主表中不再存在的行

select * from your-secondary-table where foreign_key_id not in (select id from your-primary-table)
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方言

奇怪为什么会有否决票?我想这似乎是一个合理的问题,因为您没有对在线可用的SQL信息进行基本搜索。就像in语句一样,也有not in语句。。。所以你在问之前没有仔细看。这应该是显而易见的事情,很快就能找到。一个不符合我所知的标准不会满足我正在努力做的事情。那么,你能正确地重新表达你的要求吗?我们的理解是,您只需要查找表中的行,这些行具有另一个表中可能已删除的行的外键,这将返回其他10000行,但会像that@timpone-其他10000是什么意思?它将只返回ID不在此ID列表中的行。因此,我正在清理一些数据,这些数据是陈旧数据,因此主表中不存在外键,即脏数据。我是从一个合伙人那里得到的。我想删除这些孤立的记录。因此,如果我只是像在您的查询中那样从主表中进行选择,我将返回所有其他记录,而我所需要的只是一个不退出的记录。非常确定这是一个左外连接,但我认为可以完成easier@timpone-你能给我举个例子说明这对你不起作用吗?所需的数据是什么?例如,在示例中,表上方的小提琴包含ID:10400103391047613212。您想要的是列表10437、10476、13212、13215中不存在的ID,对吗?这将为您提供ID为10400和`103991的行。这不是你要找的吗?如果没有,示例中所需的输出是什么?因此我需要限制为该集合,这样的查询将返回不在这几个数字中的完整集合。您已经知道如何执行“in”语句,现在您知道如何执行“not in”,这不就是将它们与“and”now组合的简单情况吗?我添加了一个编辑。我不认为把一个in和一个not in结合起来就能得到我想要的东西。基本上,这不是一种简单的关系。我只能从第二张桌子开始。我不知道你为什么认为它会返回所有东西。不会的。它只会返回孤立记录。thx,我看到你的评论。thx kris,我希望它能这么简单,但是这个关系已经非规范化了,所以我想用其他的方法做一个左外连接,它是什么意思?使用“左联接”不需要表之间有关系。。。如果我理解正确,您使用的是哪个数据库?我在postgres..Y,MySQL 5.5上尝试了这个查询;因此,非规范化意味着您故意违背数据库规范化。两个常见的原因:1。绩效2。创建更灵活的关系这在rails中被大量使用