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

Update with a minimum value from a union in Oracle

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 。关于如何实现这一点有什么想法吗?

这是范围界定的问题。 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
                    );