使用CTE从JOIN中的两个SQL Server表中删除记录

时间:2018-03-22 11:01:47

标签: sql sql-server common-table-expression

我想从SQL Server 2012中的此CTE中删除JOIN中两个表中的记录:

WITH RECORDS_TO_DELETE ([Counter], [ID])
AS
(
SELECT D.[Counter], D.[ID], C.[ID] 
FROM [Table1] AS D
           LEFT JOIN 
               (
                 SELECT [ID] FROM [Table2]
                 WHERE NOT LOWER (COL1) = '*my criteria*'
                 AND (Date1 <= '31-Mar-2010' OR Date2 <= '31-Mar-2010')) AS C
            ON D.ID = C.ID   
)
DELETE FROM RECORDS_TO_DELETE

我已经看到其他一些例子说明以正确的顺序执行此操作非常重要,但这些示例不在CTEs中。我使用了CTE,因为我有一个复杂的WHERE子句(可能因为我的JOIN对结果集很复杂),我觉得我没有必要在这里包含。 CTE是唯一选择我想要删除的数据的东西。

有没有办法从两个表中删除两个表匹配的记录?

2 个答案:

答案 0 :(得分:1)

为了从两个表中删除记录,使用CTE识别要删除的两个表中所有记录的主键值,并在某处写入这些值(表变量,临时表,实际表,可能基于您的数据量)。

然后执行两个DELETE语句,每个表对应一个表,加入相关表的键值。

您需要该表来保存您的值,因为在您从第一个表中删除后,您的CTE将无法再识别所需的记录。

WITH cte AS
(
    INSERT YOUR LOGIC HERE
)
INSERT INTO @KeyValuesHoldingTable
SELECT 
    *
FROM 
    cte;

DELETE Table1
FROM
    Table1 as t
JOIN
    @KeyValuesHoldingTable as h
        ON t.KeyValues = h.KeyValues;

DELETE Table2
FROM
    Table2 as t
JOIN
    @KeyValuesHoldingTable as h
        ON t.KeyValues = h.KeyValues;       

答案 1 :(得分:0)

SQL Server仅允许cascading delete语句从一个表中删除记录。

从多个记录中删除记录时会想到两个选项。第一种是使用delete选项定义外键关系。第二种是在组合两个表的视图上定义触发器。

这些修改都不是真正使用from file1 import data 语句。换句话说,数据库需要设计为支持一次从多个表中删除。