基于多表计算值的SQL更新

时间:2019-03-27 19:40:34

标签: sql oracle

我有一条SQL语句,它将每天针对我的数据库运行;从逻辑上讲,它将在一段时间后将一个表的值设置为null。但是,确定该期限是否过去需要检查另外两个表,然后根据其中包含的值来计算过去的时间长度。

我当前的SQL语句可用于这些目的(请参阅下文),但是由于它依赖于IN子句的使用,因此有可能会违反适用于IN子句的1000个元素限制。我想重新格式化该查询,使其不再依赖于IN,因此,此更新涉及多少记录都无关紧要。

UPDATE table1 SET table1.field1 = null
WHERE table1.table1_id IN
(SELECT table1_id
 FROM (SELECT table1_id, (SYSDATE - MAX(table2.date_field)) days
       WHERE table1.field1 IS NOT null
       AND table1.table1_id = table2.table1_fk
       AND table2.table3_fk = table3.table3_id
       AND (table3.type = X OR table3.type = Y)
       GROUP BY table1_id) tmp_table
 WHERE days >= cutoff)

如何重写此表,以便不依赖于可能出错的IN子句将table1的field1适当地设置为null?这是一个Oracle数据库,无论在何种程度上影响可能的解决方案。

1 个答案:

答案 0 :(得分:0)

不确定我是否完全理解您的问题,但写查询的另一种方法是使用EXISTS。像这样的东西:

UPDATE table1
SET table1.field1 = null
WHERE exists 
(SELECT null
 FROM (SELECT table1_id, (SYSDATE - MAX(table2.date_field)) days
       WHERE table1.field1 IS NOT null
       AND table1.table1_id = table2.table1_fk
       AND table2.table3_fk = table3.table3_id
       AND (table3.type = X OR table3.type = Y)
       GROUP BY table1_id) tmp_table
WHERE days >= cutoff
and table1.table1_id = tmp_table.table1_id)