Mysql 当数据丢失2个连接时删除行
我习惯于结合使用连接和“IS NULL”删除行,如 例子: 人A有1类的数字1。人B有第2类的数字2,但也有第1类的数字1 查询: 结果: 我想删除所有没有类型2编号的人员,在本例中为人员a 首先,我尝试了usal的方法(如果它是一个连接,则该方法有效) 尝试: 但这会同时删除人“A”和人“B”,因为“B”的数字不是类型2 如何删除没有类型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
(实际示例有更多的连接,更复杂的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都被删除:第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二个。第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二个。第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二个。第一个使用函数作为引用,而第二个使用列,所以第二个应该更快。在我更复杂的情况下尝试第二种方法。