我想将表中的外键更新为来自新插入的值,其中该键当前为空。这里需要注意的是,INSERT 中的信息与表相关。
考虑这个例子:
- 汽车有一个car_part
- car 和 car_part 都与 version_control 有关联(version_control 有一个 id,from_version,to_version,active)
- 一些汽车目前有一个空版本控制。
- 由于汽车有一个带有 version_control 的 car_part,我们本质上想为汽车创建一个新的 version_control,并使用与 car_part 的 version_control 相同的信息填充它
例如:
CAR
|id|car_part_id|version_control_id|
|1 |10 | |
CAR_PART
|id|version_control_id|
|10|100 |
VERSION_CONTROL
|id |from |to |
|100|1990 |2012 |
对于上面的例子,我们想要:
- 更新汽车1,
- 添加与 version_control #100 具有相同信息的新 version_control
在实际示例中,有数百辆汽车,其中数十辆汽车的 version_control_id 为空,因此我们需要在单个查询中完成。
我们如何将下面的 PSEUDO 代码更改为解决此问题的有效 SQL?
UPDATE car
WITH inserted_version as (
INSERT INTO version_control(
id, active, from_version_id, to_version_id)
WITH vc_to_create as (
select c.id as car_id,vc.* from car c
inner join car_part cp on cp.id = c.car_part_id
inner join version_control vc on cp.version_control_id=vc.id
where c.version_control_id IS NULL
)
SELECT nextval('pk_entities'),vctc.active, vctc.from_version_id, vctc.to_version_id)
FROM vc_to_create vctc
RETURNING id
)
SET version_control_id=(SELECT i_vc.id FROM inserted_vc i_vc)
WHERE id=vc_to_create.car_id -->vc_to_create Not available here