使用Oracle中的联合使用最小值进行更新

时间:2016-09-17 12:28:33

标签: oracle sql-update min union-all

UPDATE table1 t SET t.columnA =
(SELECT MIN(columnB) FROM
    (SELECT columnB FROM table2
    WHERE table2.fk = t.pk
    UNION ALL
    SELECT columnB FROM table3
    WHERE table3.fk = t.pk))

给了我ORA-00904: "T"."PK": invalid identifier。关于如何实现这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

这是范围界定的问题。 Oracle无法识别外部查询别名多于一层嵌套深度。

如果我们假设值都在两个表中,那么您可以将LEAST()与子查询一起使用:

UPDATE table1 t
    SET t.columnA =  LEAST( (SELECT MIN(columnB)
                             FROM table2
                             WHERE table2.fk = t.pk
                            ),
                            (SELECT MIN(columnB)
                             FROM table3
                             WHERE table2.fk = t.pk
                            )
                          );

如果没有,您可以通过将关联子句移出一个级别来修改查询:

UPDATE table1 t
    SET t.columnA = (SELECT MIN(columnB)
                     FROM ((SELECT table2.fk, columnB FROM table2
                           ) UNION ALL
                           (SELECT table3.fk, columnB FROM table3
                           )
                          ) tt
                     WHERE tt.fk = t.pk
                    );