Mam zapytanie, które działa dobrze w MySQL, ale kiedy uruchamiam je na Oracle, pojawia się następujący błąd:
Błąd SQL: ORA-00933: Niepoprawnie zakończone polecenie SQL
00933. 00000 - „Niepoprawnie zakończone polecenie SQL”
Zapytanie to:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
sql
oracle
inner-join
ora-00933
użytkownik169743
źródło
źródło
Odpowiedzi:
Ta składnia nie jest poprawna w Oracle. Możesz to zrobić:
Lub możesz to zrobić:
Zależy to od tego, czy widok wbudowany jest uważany przez Oracle za aktualizowalny (możliwość aktualizacji drugiego wyrażenia zależy od niektórych reguł wymienionych tutaj ).
źródło
Użyj tego:
źródło
merge into table 1 t
takiego.ON
,trg
jest alias dla tabeli głównej (tabelatable1
„zewnętrzna” według twojej logiki) isrc
odwołuje się doUSING
grupy („tabela wewnętrzna” według twojej logiki). Ale tak, prawdopodobnie można by się do niego lepiej odwoływać, ale udało mi się go śledzić.MERGE
zWHERE
klauzulą:Potrzebujesz
WHERE
klauzuli, ponieważON
nie można zaktualizować kolumn, do których odwołuje się klauzula.źródło
źródło
Nie używaj niektórych z powyższych odpowiedzi.
Niektórzy sugerują użycie zagnieżdżonego WYBIERZ, nie rób tego, jest niesamowicie powolny. Jeśli masz wiele rekordów do zaktualizowania, użyj dołączenia, więc coś takiego:
Zobacz ten link, aby uzyskać więcej informacji. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .
Upewnij się także, że na wszystkich dołączanych stołach znajdują się klucze podstawowe.
źródło
Jak wskazano tutaj , ogólna składnia pierwszego rozwiązania zaproponowanego przez Tony'ego Andrewsa to:
Myślę, że jest to interesujące, szczególnie jeśli chcesz zaktualizować więcej niż jedno pole.
źródło
Poniższa składnia działa dla mnie.
źródło
SET
robiłem aREPLACE
i próbowałem usunąć konkretny ciąg w kolumnie - okazuje się, że Oracle traktuje''
jako null, a tego pola nie można było zerować. Myślałem, że składnia po prostu aktualizuje tabelę tymczasową zamiast prawdziwej, ale się myliłem.Używanie opisu zamiast desc dla table2,
źródło
Działa dobrze wyrocznia
źródło
t1.First_Name = t2.FirstName, t1.Last_Name = t2.LastName
w tabeli po dopasowaniu jej w kolumnie „UserName” (t1.UserName = t2.UserName
), aby pobrać ich nazwę z tabeli o nazwie UserInfo (select * from UserInfo) t2
). Baza danych była taka, że używała UserName jako klucza podstawowego do UserInfo wszędzie, zamiast umieszczać FirstName i LastName bezpośrednio w tabeli. To naprawiło to!źródło
źródło
Dla kompletności, a ponieważ mówimy o Wyroczni, można to również zrobić:
źródło
A i B to pola aliasów, nie musisz wskazywać tabeli.
źródło
źródło