Я не понимаю, что колонка ORA-01779 тоже ссылается - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть таблица с 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, потому что выглядитРаботает только для обновления ПК:

1 Ответ

1 голос
/ 24 сентября 2019

После выполнения примера теста решите, попробуйте создать PK на второй таблице и работайте:

SQL DEMO

CREATE TABLE newCities
    ("city_id" int GENERATED BY DEFAULT AS IDENTITY, 
     "new_city_id" int,
     PRIMARY KEY("city_id") 
);
...