【问题标题】:DELETE specific rows that matches all values删除与所有值匹配的特定行
【发布时间】:2015-10-20 02:55:53
【问题描述】:

假设我有一张桌子

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

【问题讨论】:

    标签: sql-server tsql sql-server-2012


    【解决方案1】:

    您可以在 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
    

    【讨论】:

    • 谢谢。我认为您的方法与我的方法相同,但要加入。为什么我的没有加入就不能工作?
    • 由于您的DELETE 的目标是MyTable,并且不存在将MyTablet 链接的条件,所以MyTable 的所有行都会被删除。
    • 此外,在DELETE 语句中将一个表链接到另一个表时,表必须位于FROMJOIN 中。但是,DELETE 语句的目标是 DELETE 关键字之后的表。
    • 谢谢,有道理。你能想出另一种方法来避免加入条件吗?对于 n 列,这仍然很难看。类似于用 MyTable EXCEPT VALUES 替换 MyTable?
    • 我认为你不需要 select * from
    猜你喜欢
    • 2021-12-11
    • 2019-12-27
    • 2014-09-19
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多