使用 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
);
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
);