Załóżmy, że mam dwie tabele, t1 i t2, które są identyczne pod względem układu, ale mogą zawierać różne dane.oracle diff: jak porównać dwie tabele?
Jaki jest najlepszy sposób na rozdzielenie tych dwóch tabel?
Załóżmy, że mam dwie tabele, t1 i t2, które są identyczne pod względem układu, ale mogą zawierać różne dane.oracle diff: jak porównać dwie tabele?
Jaki jest najlepszy sposób na rozdzielenie tych dwóch tabel?
Można spróbować użyć zestaw operacji: MINUS
i INTERSECT
Zobacz tutaj po więcej szczegółów: http://oreilly.com/catalog/mastorasql/chapter/ch07.html
W przypadku tego rodzaju pytań uważam, że trzeba bardzo dokładnie określić, czego się szuka, ponieważ istnieje wiele sposobów na ich interpretację i wiele różnych podejść. Niektóre podejścia będą zbyt duże, jeśli twoje pytanie tego nie uzasadnia.
Na najprostszym poziomie: "Czy dane w tabeli są takie same czy nie?", Na które można próbować odpowiedzieć za pomocą prostego porównania zliczeń, zanim przejdzie się do czegoś bardziej złożonego.
Na drugim końcu skali znajduje się "pokaż mi wiersze z każdej tabeli, dla których nie ma równoważnego wiersza w drugiej tabeli" lub "pokaż mi, gdzie wiersze mają ten sam klucz identyfikacyjny, ale inne wartości danych" .
Jeśli rzeczywiście chcesz zsynchronizować tabelę A z tabelą B, możesz to zrobić stosunkowo prosto, używając polecenia MERGE.
Polecenie "MERGE" było dla mnie nowe. W wielu sytuacjach robi to dokładnie. – thrag
Jeśli masz trochę pieniędzy do wydania, użyj narzędzia PowerDIFF dla Oracle: http://www.orbit-db.com. Jest wyposażony w wiele opcji porównania i doskonale sprawdza się w tego rodzaju zastosowaniach.
Spróbuj tego:
(select * from T1 minus select * from T2) -- all rows that are in T1 but not in T2
union all
(select * from T2 minus select * from T1) -- all rows that are in T2 but not in T1
;
Brak zewnętrznego narzędzia. Brak problemów z wydajnością z union all
.
Możesz wypróbować dbForge Data Compare for Oracle, ** darmowe narzędzie graficzne do porównywania danych i synchronizacji, które może wykonywać te akcje w całej bazie danych lub częściowo.
Szybkie rozwiązanie:
SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2
Rejestry powinny pokazać ...
select * from table1 where table1.col1 in (select table2.col1 from table2)
Zakładając col1
jest kolumna klucz podstawowy i to daje wszystkie wiersze w table1
odpowiednio do kolumny table2
.
select * from table1 where table1.col1 not in (select table2.col1 from table2)
Nadzieja to pomaga
Spróbuj:
select distinct T1.id
from TABLE1 T1
where not exists (select distinct T2.id
from TABLE2 T2
where T2.id = T1.id)
SQL Oracle 11g +
Domniemana odrębny na te byłyby niekorzystne dla wydajności chociaż. –