2015-10-20 125 views
4

說我有一個表刪除特定行,所有值匹配

SELECT * INTO MyTable FROM (
    VALUES ('col1_a', 'col2_a', 'col3_a', 'coln_a'), 
     ('col1_b', 'col2_b', 'col3_b', 'coln_b'), 
     ('col1_c', 'col2_c', 'col3_c', 'coln_c') 
) t (col1, col2, col3, coln) 

我只想刪除與每一個列值相匹配的行我的具體(考慮行高度相似只有一個或兩列不同)

我當然可以寫

DELETE MyTable WHERE col1='col1_a' AND col2='col2_a' AND col3='col3_a' AND coln='coln_a' 
DELETE MyTable WHERE col1='col1_b' AND col2='col2_b' AND col3='col3_b' AND coln='coln_b' 

但是那太煩人了。我想知道是否可以通過簡單列出值來方便地編寫它?我試過這個

DELETE MyTable FROM (
    VALUES ('col1_a', 'col2_a', 'col3_a', 'coln_a'), 
     ('col1_b', 'col2_b', 'col3_b', 'coln_b') 
) t (col1, col2, col3, coln) 

但這只是刪除了MyTable中的所有行,請幫忙。

回答

2

您可以在DELETE語句中使用INNER JOIN

DELETE t1 
FROM MyTable t1 
INNER JOIN (
    SELECT * 
    FROM (VALUES 
     ('col1_a', 'col2_a', 'col3_a', 'coln_a'), 
     ('col1_b', 'col2_b', 'col3_b', 'coln_b') 
    )AS a(col1, col2, col3, coln) 
) t2 
    ON t2.col1 = t1.col1 
    AND t2.col2 = t1.col2 
    AND t2.col3 = t1.col3 

正如評論說Frisbee,你可以刪除SELECT *

DELETE t1 
FROM MyTable t1 
INNER JOIN (
    VALUES 
     ('col1_a', 'col2_a', 'col3_a', 'coln_a'), 
     ('col1_b', 'col2_b', 'col3_b', 'coln_b')  
) AS t2(col1, col2, col3, coln) 
    ON t2.col1 = t1.col1 
    AND t2.col2 = t1.col2 
    AND t2.col3 = t1.col3 
+0

感謝。我認爲你的方法和我一樣,但加入。任何原因,爲什麼我沒有加入沒有工作? – user1589188

+0

由於'DELETE'的目標是'MyTable',並且沒有條件將'MyTable'與't'鏈接,所以'MyTable'的所有行都被刪除。 –

+0

此外,當在DELETE語句中將一個錶鏈接到另一個表時,這些表必須位於FROM或JOIN中。但是,'DELETE'語句的目標是在'DELETE'關鍵字之後的表。 –