2009-03-27 41 views

Odpowiedz

4

można użyć narzędzia do tworzenia jak AQT dyferencjału między tabelami.

Innym podejściem byłoby zrzucenie tabel do pliku tekstowego i użycie narzędzia różnicowego, takiego jak WinMerge. Dzięki takiemu podejściu możesz użyć złożonego SQL, aby najpierw przekształcić tabele w ten sam układ.

1

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.

+0

Polecenie "MERGE" było dla mnie nowe. W wielu sytuacjach robi to dokładnie. – thrag

1

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.

38

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.

3

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.

alt text

1

Szybkie rozwiązanie:

SELECT * FROM TABLE1 
MINUS 
SELECT * FROM TABLE2 

Rejestry powinny pokazać ...

0

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

0

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 +