我有一个场景,我必须使用子查询来选择我要删除的行
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'由于修改,因此无法更新 影响多个基表。
答案 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
希望这能帮到你, 告诉它是否适合你:) 祝你好运!!!