2017-09-09 47 views

回答

1

我會寫這是一個選擇,所以你不要複製粘貼和軟管的東西accidentally-你可以運行它,並檢查它選擇要刪除的行

SELECT * 
FROM table t1 
WHERE 
    t1.c3 IS NULL AND 
    EXISTS(
    SELECT null FROM table t2 
    WHERE t1.c1 = t2.c1 AND COALESCE(t1.c2, 'value that will never appear in the table') = COALESCE(t2.c2, 'value that will never in the table') AND t2.c3 IS NOT NULL 
    ) 

轉換刪除應該只是一個刪除替換SELECT *的情況,但如果它不工作了不要發表評論..

編輯備註:

使用合併來演示如何確保行X上的null的c2值等於行Y上的另一個空值爲c2的值。重要的是,您爲'值永遠不會出現在表中的'值選擇的字符串'在sql中的兩次出現都是相同的,並且它永遠不會出現在表中,否則具有空值的行將與其他具有實際值的行匹配

+0

我認爲就是這樣!非常感謝你。 – geek2000

+0

我運行這個實際的表。至少有一種情況,這是行不通的。 :(例如,如果我有兩個記錄('B',null,'15'),('B',null,null)。代碼將不會返回('B',null,null)。除了從子查詢中刪除c2以外,我有12列,其中任何一列都可以爲空值 – geek2000

+0

從技術上來說,null永遠不會與其他任何東西相等,甚至不會是另一個null,但是如果你正在創建一個業務邏輯決策,在c2上的null與另一行中的null相同,所以log與c1是相同的,那麼你可以使用coalesce將null轉換爲等價值。我將編輯我的答案來演示 –