DELETE差异不是IN而不是EXISTS

时间:2010-02-06 09:50:01

标签: mysql

我有两个场景如下所示,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`);

2 个答案:

答案 0 :(得分:4)

我没有测试过,但它们很可能不等同。如果与相关子查询一起使用,则NOT EXISTS表单将有意义。但是您的子查询不包含对外部查询的任何引用,因此第二种形式可能根本不会删除任何行。

此外,表中存在NULL可能会使这两种形式的行为截然不同。

答案 1 :(得分:2)

据我所知,这两个查询应该实现相同的结果(因为查询检查相同的数据 - 只有第二个查询可能以更优雅的方式执行)。