У меня есть таблица с POI, вы можете иметь несколько POI для каждого города.
SQL DEMO
CREATE TABLE POI
("poi_id" int GENERATED BY DEFAULT AS IDENTITY,
"city_id" int,
PRIMARY KEY("poi_id")
);
Теперь естьБыли внесены некоторые изменения в полигоны городов, и теперь мне нужно было переназначить некоторые POI
CREATE TABLE newCities
("city_id" int, "new_city_id" int)
;
DATA
INSERT ALL
INTO POI ("poi_id", "city_id")
VALUES (10, 1)
INTO POI ("poi_id", "city_id")
VALUES (11, 1)
INTO POI ("poi_id", "city_id")
VALUES (12, 2)
INTO POI ("poi_id", "city_id")
VALUES (13, 2)
INTO POI ("poi_id", "city_id")
VALUES (14, 5)
SELECT * FROM dual
;
INSERT ALL
INTO newCities ("city_id", "new_city_id")
VALUES (1, 100)
INTO newCities ("city_id", "new_city_id")
VALUES (2, 200)
INTO newCities ("city_id", "new_city_id")
VALUES (3, 200)
SELECT * FROM dual
;
Когда я присоединяюсь:
SELECT *
FROM poi p
JOIN newCities nc
ON p."city_id" = nc."city_id";
ВЫХОД
+--------+---------+---------+-------------+
| poi_id | city_id | city_id | new_city_id |
+--------+---------+---------+-------------+
| 10 | 1 | 1 | 100 |
| 11 | 1 | 1 | 100 |
| 12 | 2 | 2 | 200 |
| 13 | 2 | 2 | 200 |
+--------+---------+---------+-------------+
Но когда я пытаюсь выполнить обновление, но получаю ошибку:
ORA-01779: невозможно изменить столбецкоторая сопоставляется с таблицей без сохранения ключа
UPDATE (
SELECT p.*, nc."new_city_id"
FROM poi p
JOIN newCities nc
ON p."city_id" = nc."city_id"
) t
SET t."city_id" = t."new_city_id";
Я знаю, city_id
не PK, но строка совпадает со строкой, включающей PK.Так почему не работает?
Я знаю, что могу сделать подзапрос, чтобы получить значение:
UPDATE poi p
SET "city_id" = COALESCE((SELECT "new_city_id"
FROM newCities c
WHERE c."city_id" = p."city_id")
, p."city_id");
Но все же хочу знать, в каких случаях будет работать UPDATE JOIN, потому что выглядитРаботает только для обновления ПК: