Tabela 1:
id name desc
-----------------------
1 a abc
2 b def
3 c adf
Tabela 2:
id name desc
-----------------------
1 x 123
2 y 345
W Oracle SQL, jak uruchomić kwerendę aktualizacyjną SQL, która może aktualizować tabelę 1 za pomocą tabeli 2 name
i desc
używać tego samego id
? Więc końcowy wynik, który otrzymam, to
Tabela 1:
id name desc
-----------------------
1 x 123
2 y 345
3 c adf
Pytanie pochodzi z aktualizacji jednej tabeli danymi z innej , ale specjalnie dla Oracle SQL.
sql
oracle
sql-update
Muhd
źródło
źródło
Odpowiedzi:
Nazywa się to aktualizacją skorelowaną
Zakładając, że wyniki łączenia zostaną wyświetlone w zachowanym kluczu, możesz również
źródło
WHERE EXISTS
uniemożliwia aktualizację wiersza w,t1
jeśli nie ma pasującego wiersza wt2
. Bez tego każdy wiersz wt1
zostanie zaktualizowany, a wartości zostaną ustawione na,NULL
jeśli nie ma pasującego wiersza wt2
. Zasadniczo nie jest tak, jak chcesz, więcWHERE EXISTS
jest to na ogół potrzebne.SELECT ... FROM t2
wynikiem musi być unikalny wiersz. Oznacza to, że musisz wybrać wszystkie pola, które zawierają unikalny klucz - nieunikalny klucz podstawowy nie jest wystarczający. Bez wyjątkowości zostajesz zredukowany do czegoś w rodzaju pętli @ PaulKarr - a jeśli nie ma unikalnej korelacji, dla każdego wiersza źródłowego można zaktualizować więcej niż jeden wiersz docelowy.table2
) zwraca wiele wierszy dla jednej lub więcejtable1
wartości, a Oracle nie wie, którego chcesz użyć. Zwykle oznacza to, że musisz udoskonalić podkwerendę, aby zwróciła pojedynczy odrębny wiersz.Spróbuj tego:
źródło
table1
itable2
są tą samą tabelą, po prostuON
uważaj na -part iWHERE
-lause dla -statementSELECT
oftable2
!próbować
źródło
nigdy dla mnie nie działało, ponieważ zestaw oczekuje tylko 1 wartości - Błąd SQL: ORA-01427: jedno-wierszowe podzapytanie zwraca więcej niż jeden wiersz.
oto rozwiązanie:
Tak właśnie uruchamiasz go w arkuszu SQLDeveloper. Mówią, że jest powolny, ale to jedyne rozwiązanie, które działało dla mnie w tej sprawie.
źródło
Wydaje się, że jest to jeszcze lepsza odpowiedź z klauzulą „in”, która pozwala na wiele kluczy dla złączenia :
Wołowina polega na tym, że kolumny mają być używane jako klucz w nawiasach w klauzuli where przed „in” i mieć instrukcję select o takich samych nazwach kolumn w nawiasach. gdzie ( kolumna 1, kolumna 2 ) w ( wybierz ( kolumna 1, kolumna 2 ) z tabeli, w której „zestaw chcę” ;
źródło
404
)Jeśli twoja tabela t1 i jej kopia zapasowa t2 mają wiele kolumn, oto kompaktowy sposób na zrobienie tego.
Ponadto moim powiązanym problemem było to, że tylko niektóre kolumny zostały zmodyfikowane, a wiele wierszy nie było edytowanych w tych kolumnach, więc chciałem zostawić je w spokoju - w zasadzie przywróć podzbiór kolumn z kopii zapasowej całej tabeli. Jeśli chcesz przywrócić wszystkie wiersze, pomiń klauzulę where.
Oczywiście najprościej byłoby usunąć i wstawić jako zaznaczone, ale w moim przypadku potrzebowałem rozwiązania z tylko aktualizacjami.
Sztuczka polega na tym, że gdy wybierzesz * z pary tabel ze zduplikowanymi nazwami kolumn, druga z nich otrzyma nazwę _1. Oto co wymyśliłem:
źródło
źródło