Sql server 删除与所有值匹配的特定行

Sql server 删除与所有值匹配的特定行,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,假设我有一张桌子 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) 我只想删除与我指定的每一列值匹配的行(考虑行非常相似,只有一

假设我有一张桌子

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中的所有行,请提供帮助。

您可以在
DELETE
语句中使用
internaljoin

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

如所述,您可以删除
选择*

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

谢谢我认为你的方法和我的方法一样,只是加入了。我的没有联接就不能工作的原因是什么?因为
DELETE
的目标是
MyTable
,并且不存在使用
t
链接
MyTable
的条件,所以
MyTable
的所有行都会被删除。此外,在
DELETE
语句中将一个表链接到另一个表时,这些表必须位于
FROM
JOIN
中。但是,
DELETE
语句的目标是
DELETE
关键字后面的表。谢谢,这很有意义。你能想出另一种方法来避免加入条件吗?对于n列来说,这仍然很难看。类似于用MyTable替换MyTable,除了值之外?我认为您不需要select*from