テーブルの外部キーを新しい挿入からの値に更新したいのですが、そのキーは現在nullです。ここでの注意点は、INSERT の情報がテーブルに関連していることです。
例を考えてみましょう:
- 車には car_part があります
- car と car_part の両方に version_control への関連付けがあります (version_control には from_version,to_version,active という ID があります)
- 一部の車には現在、null version_control があります。
- 車には 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 が null であるため、これを 1 回のクエリで実行する必要があります。
以下の 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