根据另一张表的结果清空表格

时间:2015-02-23 09:41:36

标签: mysql

我有两个互连的表:一个存储一些通用结果(table1),另一个存储每个结果的N行(table2)。 table2中的每条记录都有一个记录" auto_id" table1引用行(字段名为" ref_id")

我故意从table1中删除了一些记录,但是我在table2中保留了引用的行。

如何找到表2中包含无效" ref_id" s的所有行,这些行链接到不再存在" auto_id"在table1?

我在想像

这样的东西
SELECT *
FROM table2
WHERE NOT EXISTS(
   SELECT auto_id
   FROM 'table1'
   WHERE 'table2.res_id' = auto_id
)

但显然有一些错误。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

您使用的是错误的引号。单引号(撇号或ASCII 39)用于文字字符串。最简单的解决方案是删除引号:

SELECT *
    FROM table2
    WHERE NOT EXISTS(
       SELECT auto_id
       FROM table1
       WHERE table2.res_id = auto_id
    );

如果要在MySQL中引用标识符,请使用反引号(ASCII 96)。

SELECT *
    FROM `table2`
    WHERE NOT EXISTS(
       SELECT auto_id
       FROM `table1`
       WHERE `table2`.`res_id` = `auto_id`
    );

答案 1 :(得分:1)

最简单的方法是IMHO是缺少行的外连接过滤:

SELECT t2.*
FROM table2
LEFT JOIN table1 t1 ON t1.auto_id = t2.res_id
WHERE t1.auto_id IS NULL

这是有效的,因为错过的左连接在其列中具有所有空值,并且在连接之后>应用了子句条件 - IS NULL条件意味着返回的唯一行是那些< em> don&#t> 在另一个表中有匹配的行。

除了效率最高(假设table1.auto_id上的索引)之外,它还提供了比NOT IN (...)查询更简洁的查询。

答案 2 :(得分:0)

MySQL JOIN是您的最佳选择。 试试这个:

SELECT *
FROM table2 T2
 JOIN table1 T1
 ON T2.`res_id` != T1.`auto_id`