2010-02-06 80 views
2

我有两个方案表示如下,方案1名的作品以及场景2,但都是这些场景实现同样的目标,在这两个方案的otherTbl注意的是静态DELETE差异NOT IN VS NOT EXISTS

情景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的删除查询,它仍将以相同的方式工作。

******简单的版本******

是:

DELETE FROM `tbl` WHERE tbl.col1 NOT IN (SELECT col1 FROM tmp_tbl); 

Equall要:

DELETE FROM `tbl` WHERE NOT EXISTS(SELECT col1 FROM `tmp_tbl`); 

回答

4

我还没有测试过它,但它们很可能并不等同。如果与相关的子查询一起使用,那么NOT EXISTS表单将很有意义。但是你的子查询不包含任何对外部查询的引用,所以可能第二个表单根本不会删除任何行。

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

+0

谢谢。有没有办法解决它。我可以使用另一个查询来解决我的NOT IN问题吗? – 2010-02-07 05:58:23

+1

你可以发布相关查询的例子吗?这将不胜感激:D – 2010-02-07 07:43:32

2

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

+0

Thanks Bro .....:D – 2010-02-06 10:03:07

+0

任何机构都可以确认100%... sry Pawel需要确定,当这个东西被释放时可能不是很好。 xD – 2010-02-06 10:08:05