Как преобразовать MySQL-запрос в Oracle (используя UPDATE и INNER JOIN 2 раза с 3 таблицами) - PullRequest
2 голосов
/ 31 октября 2019

У меня следующий запрос MySQL:

UPDATE spot ST 
INNER JOIN tag_mapping_spot c ON c.spot_id = ST.spot_id 
INNER JOIN def_table b ON b.tag_id = c.tag_id 
SET ST.spot_name = b.tag_ja

Недавно я перешел на oracle и хочу преобразовать этот запрос в версию oracle. Я искал и пробовал

UPDATE ( SELECT spot.spot_name as f1, def_table.tag_ja as f2 
        FROM spot 
        INNER JOIN tag_mapping_spot 
        ON tag_mapping_spot.spot_id = spot.spot_id
        INNER JOIN def_table
        ON def_table.tag_id = tag_mapping_spot.tag_id
        ) j
SET j.f2 = j.f1

и

MERGE into spot
USING tag_mapping_spot
ON (tag_mapping_spot.spot_id = spot.spot_id)
USING def_table
ON (def_table.tag_id = tag_mapping_spot.tag_id)
WHEN MATCHED THEN UPDATE SET spot.spot_name = def_table.tag_jae

Но ни один из них не работает. Как мне с этим бороться? Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 31 октября 2019

Вы можете использовать inline view в операторе MERGE:

 MERGE INTO spot s
 USING ( SELECT distinct st.spot_name, c.spot_id , b.tag_ja
           FROM spot st 
           JOIN tag_mapping_spot c ON c.spot_id = st.spot_id 
           JOIN def_table b ON b.tag_id = c.tag_id ) tt
    ON (s.spot_id = tt.spot_id)
  WHEN MATCHED THEN
UPDATE SET s.spot_name = tt.tag_ja;   
1 голос
/ 31 октября 2019

Вот что вы можете использовать для ОБНОВЛЕНИЯ:

UPDATE spot s
SET s.spot_name = (SELECT def_table.tag_ja as f2
                      FROM def_table
                      INNER JOIN tag_mapping_spot
                      ON tag_mapping_spot.tag_id = def_table.tag_id
                      WHERE tag_mapping_spot.SPOT_ID = s.SPOT_ID)
WHERE s.spot_id in (select spot_id from tag_mapping_spot );

Вот это ДЕМО

А вот хороший скрипт, который покажет вам, как использовать MERGE: SCRIPT

И если у вас есть двойная запись во всех таблицах, отметьте это DEMO

UPDATE spot s
SET s.spot_name = (SELECT max(def_table.tag_ja) as f2
                      FROM def_table
                      INNER JOIN tag_mapping_spot
                      ON tag_mapping_spot.tag_id = def_table.tag_id
                      WHERE tag_mapping_spot.SPOT_ID = s.SPOT_ID)
WHERE s.spot_id in (select spot_id from tag_mapping_spot );
0 голосов
/ 31 октября 2019

Вы можете написать свой запрос следующим образом:

update spot set spot_name = 
 (SELECT def_table.tag_ja as f2 
        FROM spot 
        INNER JOIN tag_mapping_spot 
        ON tag_mapping_spot.spot_id = spot.spot_id
        INNER JOIN def_table
        ON def_table.tag_id = tag_mapping_spot.tag_id) 

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...