我有两个场景如下所示,SCENARIO 1和SCENARIO 2一样,但都是SCENARIOS实现相同的目标,注意在两个场景中otherTbl
是静态的
情景1
CREATE TABLE `tbl`(
col1 VARCHAR(255),
PRIMARY KEY(col1)
) ENGINE='InnoDb';
以下是我之前运行的一组有意义且运行正常的查询。
#Create an exact copy of the `tbl`
CREATE TEMPORARY TABLE `tmp_tbl`( .. SAME AS `tbl` .. );
#Add grouped records from another table into `tmp_table`
INSERT INTO tmp_tbl SELECT col1 FROM otherTbl GROUP BY col1;
#Delete the tables that donot exist any more int the `otherTbl`
DELETE FROM tbl WHERE tbl.col1 NOT IN (SELECT col1 FROM tmp_tbl);
情景2
在这种情况下,区别仅在于列,您可以看到所有列都是主键
CREATE TABLE `tbl`(
col1 VARCHAR(255),
col2 VARCHAR(255),
col3 VARCHAR(255),
PRIMARY KEY(col1, col2, col3)
) ENGINE='InnoDb';
以下是新的查询集
#Create an exact copy of the `tbl`
CREATE TEMPORARY TABLE `tmp_tbl`( .. SAME AS `tbl` .. );
#Add grouped records from another table into `tmp_table`
INSERT INTO tmp_tbl
SELECT col1, col2, col3 FROM otherTbl GROUP BY col1, col2, col3;
#Delete the tables that donot exist any more int the `otherTbl`
DELETE FROM tbl WHERE NOT EXISTS(SELECT col1, col2, col3 FROM `tmp_tbl`);
问题很简单,如果我们在SCENARIO 1中将删除查询从NOT IN
替换为NOT EXISTS
,它们是否仍会以相同的方式工作,那么他们是否会得到相同的结论。
****** SIMPLE VERSION ******
是:
DELETE FROM `tbl` WHERE tbl.col1 NOT IN (SELECT col1 FROM tmp_tbl);
等于:
DELETE FROM `tbl` WHERE NOT EXISTS(SELECT col1 FROM `tmp_tbl`);
答案 0 :(得分:4)
我没有测试过,但它们很可能不等同。如果与相关子查询一起使用,则NOT EXISTS表单将有意义。但是您的子查询不包含对外部查询的任何引用,因此第二种形式可能根本不会删除任何行。
此外,表中存在NULL可能会使这两种形式的行为截然不同。
答案 1 :(得分:2)
据我所知,这两个查询应该实现相同的结果(因为查询检查相同的数据 - 只有第二个查询可能以更优雅的方式执行)。