SQL从使用连接的子查询中删除

时间:2014-04-02 20:38:07

标签: sql sql-server

我有一个场景,我必须使用子查询来选择我要删除的行

DELETE FROM myTable 
WHERE
(
SELECT 
myFunction(table1.prikey, table2.bbbb) AS myValue,
timezoneFunction(table1.time, table3.ttt) AS recordTime
FROM table1
JOIN table2 ON table1.xxx = table2.xxxx
JOIN table3 ON table3.yyy = table1.yyy
WHERE table1.time DATEADD(day, -2 , Date1) AND DATEADD(day, 2 , Date12)
) myTable
WHERE 
recordTime BETWEEN Date1 AND Date12
AND myValue Between 10 AND 20

将两个函数放在where子句上会对性能产生很大影响。所以我必须按照上述方式去做。

但是现在我得到了这个错误并且它完全合理。但是方法是什么?

  

查看或功能' myTable'由于修改,因此无法更新   影响多个基表。

2 个答案:

答案 0 :(得分:1)

首先,代码段中存在明显的拼写错误。

其次,M Ali对于删除一个表是正确的,但是可以使用带有CTE的DELETE FROM FROM子句。

以下是一些示例代码。您加入的条件可能有所不同请使用> <处理日期而不是之间。

--
-- Sample code
--
;
WITH CTE_DELETE_LIST
AS
(
    SELECT 
        t1.priKey
        myFunction(t1.prikey, t2.bbbb) as myValue,
        timezoneFunction(t1.time, t3.ttt) as recordTime
    FROM table1 as t1
    JOIN table2 as t2 ON t1.xxx = t2.xxx
    JOIN table3 as t3 ON t3.yyy = t1.yyy
    WHERE 
        t1.time > DATEADD(day, -2 , Date1) AND 
        t1.time < DATEADD(day, 2 , Date12)
) 
DELETE 
FROM M1
FROM MY_TABLE as M1 
JOIN CTE_DELETE_LIST as L1 ON M1.priKey = L1.priKey
WHERE 
    L1.recordTime > DATEADD(day, -2 , Date1) AND 
    L1.recordTime < DATEADD(day, 2 , Date12) AND
    L1.myValue > 10 AND 
    L1.myValue < 20

答案 1 :(得分:0)

这是我的解决方案

DELETE FROM table_to_delete_from
FROM
(
SELECT 
table1.key1
,table1.key2
,myFunction(table1.prikey, table2.bbbb) AS myValue,
,timezoneFunction(table1.time, table3.ttt) AS recordTime
FROM table1
JOIN table2 ON table1.key1 = table2.key1
JOIN table3 ON table3.key2 = table1.key2
WHERE table1.time DATEADD(day, -2 , Date1) AND DATEADD(day, 2 , Date12)
) myTable

INNER JOIN
    table_1 table_to_delete_from
      ON table_to_delete_from.key_x = table_1.key_x

WHERE 
recordTime BETWEEN Date1 AND Date12
AND myValue Between 10 AND 20

希望这能帮到你, 告诉它是否适合你:) 祝你好运!!!