2010-02-06 81 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