我想从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
是唯一选择我想要删除的数据的东西。
有没有办法从两个表中删除两个表匹配的记录?
答案 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
语句。换句话说,数据库需要设计为支持一次从多个表中删除。