我有两个互连的表:一个存储一些通用结果(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
)
但显然有一些错误。 谢谢你的帮助!
答案 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`