Mysql 当数据丢失2个连接时删除行

Mysql 当数据丢失2个连接时删除行,mysql,sql,join,sql-delete,Mysql,Sql,Join,Sql Delete,我习惯于结合使用连接和“IS NULL”删除行,如 例子: 人A有1类的数字1。人B有第2类的数字2,但也有第1类的数字1 查询: 结果: 我想删除所有没有类型2编号的人员,在本例中为人员a 首先,我尝试了usal的方法(如果它是一个连接,则该方法有效) 尝试: 但这会同时删除人“A”和人“B”,因为“B”的数字不是类型2 如何删除没有类型2号码的用户? (实际示例有更多的连接,更复杂的where parts,表中有5行miljon行。) 用于重新创建示例数据的SQL: 这是一种方式: DEL

我习惯于结合使用连接和“IS NULL”删除行,如

例子: 人A有1类的数字1。人B有第2类的数字2,但也有第1类的数字1

查询: 结果: 我想删除所有没有类型2编号的人员,在本例中为人员a

首先,我尝试了usal的方法(如果它是一个连接,则该方法有效)

尝试: 但这会同时删除人“A”和人“B”,因为“B”的数字不是类型2

如何删除没有类型2号码的用户?
(实际示例有更多的连接,更复杂的where parts,表中有5行miljon行。)

用于重新创建示例数据的SQL: 这是一种方式:

DELETE p
FROM people AS p
WHERE p.people_id NOT IN (SELECT pp.people_id
                          FROM people_phones as pp
                          INNER JOIN phone_numbers as pn
                             ON pp.phone_number = pn.phone_number
                          WHERE pn.type_id = 2);
还有另一种方式:

DELETE p
FROM people AS p
WHERE NOT EXISTS(SELECT 1 
                 FROM people_phones as pp
                 INNER JOIN phone_numbers as pn
                    ON pp.phone_number = pn.phone_number
                 WHERE pn.type_id = 2
                 AND pp.people_id = p.people_id);
第二个版本的演示(也是我推荐的版本)。

这是一种方式:

DELETE p
FROM people AS p
WHERE p.people_id NOT IN (SELECT pp.people_id
                          FROM people_phones as pp
                          INNER JOIN phone_numbers as pn
                             ON pp.phone_number = pn.phone_number
                          WHERE pn.type_id = 2);
还有另一种方式:

DELETE p
FROM people AS p
WHERE NOT EXISTS(SELECT 1 
                 FROM people_phones as pp
                 INNER JOIN phone_numbers as pn
                    ON pp.phone_number = pn.phone_number
                 WHERE pn.type_id = 2
                 AND pp.people_id = p.people_id);
第二个版本的演示(也是我推荐的版本)。

这是一种方式:

DELETE p
FROM people AS p
WHERE p.people_id NOT IN (SELECT pp.people_id
                          FROM people_phones as pp
                          INNER JOIN phone_numbers as pn
                             ON pp.phone_number = pn.phone_number
                          WHERE pn.type_id = 2);
还有另一种方式:

DELETE p
FROM people AS p
WHERE NOT EXISTS(SELECT 1 
                 FROM people_phones as pp
                 INNER JOIN phone_numbers as pn
                    ON pp.phone_number = pn.phone_number
                 WHERE pn.type_id = 2
                 AND pp.people_id = p.people_id);
第二个版本的演示(也是我推荐的版本)。

这是一种方式:

DELETE p
FROM people AS p
WHERE p.people_id NOT IN (SELECT pp.people_id
                          FROM people_phones as pp
                          INNER JOIN phone_numbers as pn
                             ON pp.phone_number = pn.phone_number
                          WHERE pn.type_id = 2);
还有另一种方式:

DELETE p
FROM people AS p
WHERE NOT EXISTS(SELECT 1 
                 FROM people_phones as pp
                 INNER JOIN phone_numbers as pn
                    ON pp.phone_number = pn.phone_number
                 WHERE pn.type_id = 2
                 AND pp.people_id = p.people_id);

第二个版本的演示(也是我推荐的版本)。

这里有一个运行上述查询的fiddle链接,a和B都被删除:这里有一个运行上述查询的fiddle链接,a和B都被删除:这里有一个运行上述查询的fiddle链接,a和B都被删除:这是一个fiddle链接,运行上面的查询,A和B都被删除:第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二个。第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二个。第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二个。第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二种方法。