使用其他表中的组合字段更新表

时间:2013-05-30 15:02:37

标签: sql oracle

我有一张表格,其中包含未来的行动。我有第二个表,其中包含所有案例,包括案件的截止日期。而且我有第三张表,其中包含数字。

问题如下。我们的系统会根据未来的操作自动填充表格。但是对于某些客户,我们需要更改这些日期。我想为此创建一个更新查询,并通过我们的调度程序运行。但是,我现在有点陷入困境。

到目前为止我对代码的了解是:

UPDATE proxima_gestion p 
SET    fecha = (SELECT To_char(d.f_ult_vencim + c.hrem01, 'yyyyMMdd') 
                FROM   deuda d, 
                       c4u_activity_dates c, 
                       proxima_gestion p 
                WHERE  d.codigo_cliente = c.codigo_cliente 
                       AND p.n_expediente = d.n_expediente 
                       AND d.saldo > 1000 
                       AND p.tipo_gestion_id = 914 
                       AND p.codigo_oficina = 33 
                       AND d.f_ult_vencim > sysdate) 
WHERE  EXISTS (SELECT * 
               FROM   proxima_gestion p, 
                      deuda d 
               WHERE  p.n_expediente = d.n_expediente 
                      AND d.saldo > 1000 
                      AND p.tipo_gestion_id = 914 
                      AND p.codigo_oficina = 33 
                      AND d.f_ult_vencim > sysdate) 

现场fecha是当前的行动日期。不幸的是,这被保存为char而不是date。这就是为什么我需要将日期转换回char。 F_ult_vencim是截止日期,而hrem01是应该从截止日期起放置操作的天数。 (例如,这可能是10,在截止日期后10天生成新日期)

除此之外,当我们需要更改日期时,还有一些标准(某些债权人,某些部门,仅针对未来的案例,并且从特定金额开始,仅针对特定的行动类型。)

但是,当我尝试运行此查询时,我收到错误消息     ORA-01427:单行子查询返回多行

如果我单独运行两个子查询,我会得到两个子结果。我想要完成的是,它连接这两个查询,并将字段更新为新值。每个案例的价值都不同,因为每个截止日期都不同。

这甚至可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

您收到错误是因为第一个SELECT为正在更新的表中的每一行返回了多行。

我看到的第一件事是UPDATE中表的别名与SELECTs(p)中的别名相同。因此,子查询中对p的所有引用都引用了子查询中的proxima_gestion 而不是外部查询。也就是说,子查询不依赖于外部查询,这是UPDATE所必需的。

尝试在两个子查询中从FROM中删除“proxima_gestion p”。然后,对p的引用将是外部UPDATE查询。