2015-10-20 137 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'关键字之后的表。 –