Ini sudah ditanyakan pada Stack Overflow , tetapi hanya untuk MySQL. Saya menggunakan PostgreSQL. Sayangnya (dan yang mengejutkan) PostgreSQL sepertinya tidak memiliki sesuatu seperti CHECKSUM table
.
Solusi PostgreSQL akan baik-baik saja, tetapi yang umum akan lebih baik. Saya menemukan http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data , tapi saya tidak mengerti logika yang digunakan.
Latar Belakang: Saya menulis ulang beberapa kode penghasil basis data, jadi saya perlu memeriksa apakah kode lama dan baru menghasilkan hasil yang identik.
postgresql
duplication
Faheem Mitha
sumber
sumber
EXCEPT
, periksa pertanyaan ini: Cara efisien untuk membandingkan dua set data besar dalam SQLJawaban:
Salah satu opsi adalah menggunakan FULL OUTER JOIN antara dua tabel dalam bentuk berikut:
Sebagai contoh:
Akan mengembalikan hitungan 2, sedangkan:
mengembalikan harapan untuk hitungan 0.
Hal yang saya sukai dari metode ini adalah ia hanya perlu membaca setiap tabel satu kali vs membaca setiap tabel dua kali saat menggunakan EXISTS. Selain itu, ini harus berfungsi untuk basis data apa pun yang mendukung gabungan luar penuh (bukan hanya Postgresql).
Saya umumnya mengecilkan penggunaan klausa PENGGUNAAN tetapi di sini adalah satu situasi di mana saya percaya itu adalah pendekatan yang lebih baik.
Tambahan 2019-05-03:
Jika ada masalah dengan kemungkinan data nol, (yaitu kolom id tidak dapat dibatalkan tetapi nilai valnya), maka Anda dapat mencoba yang berikut ini:
sumber
Anda dapat menggunakan
EXCEPT
operator. Misalnya, jika tabel memiliki struktur yang identik, berikut ini akan mengembalikan semua baris yang ada dalam satu tabel tetapi tidak yang lain (jadi 0 baris jika tabel memiliki data yang identik):Atau dengan
EXISTS
mengembalikan hanya nilai boolean atau string dengan salah satu dari 2 hasil yang mungkin:Diuji di SQLfiddle
Juga bukan yang
EXCEPT
menghapus duplikat (yang seharusnya tidak khawatir jika tabel Anda memiliki beberapaPRIMARY KEY
atauUNIQUE
kendala tetapi mungkin jika Anda membandingkan hasil kueri sewenang-wenang yang berpotensi menghasilkan baris duplikat).Hal lain yang dilakukan oleh
EXCEPT
kata kunci adalah memperlakukanNULL
nilai sebagai identik, jadi jika tabelA
memiliki baris dengan(1,2,NULL)
dan tabelB
memiliki baris dengan(1,2,NULL)
, kueri pertama tidak akan menampilkan baris ini dan kueri kedua akan kembali'same'
jika kedua tabel tidak memiliki baris lain.Jika Anda ingin menghitung baris yang berbeda, Anda bisa menggunakan variasi pada
FULL JOIN
jawaban gsiem , untuk mendapatkan semua baris (berbeda):dan untuk mendapatkan jawaban ya / tidak:
Jika semua kolom dari dua tabel tidak dapat dibatalkan, kedua pendekatan akan memberikan jawaban yang identik.
sumber
SELECT <column_list> FROM a
sebagai gantiTABLE a
EXCEPT
query benar-benar hebat!Anda perlu Kecuali klausa Sesuatu seperti
Ini mengembalikan semua baris dari tabel pertama yang tidak ada di tabel kedua
sumber
Melihat kode tertaut yang tidak Anda mengerti:
Saus rahasia digunakan
union
sebagai lawanunion all
. Yang pertama hanya mempertahankan baris yang berbeda sedangkan yang kedua menyimpan duplikat ( referensi ). Dengan kata lain query yang bersarang mengatakan "beri saya semua baris dan kolom dari EmpDtl1 dan selain itu dari EmpDtl2 yang belum ada di EmpDtl1". Hitungan subquery ini akan sama dengan jumlah EmpDtl1 jika dan hanya jika EmpDtl2 tidak berkontribusi setiap baris ke hasil yaitu dua tabel identik.Atau, buang tabel dalam urutan tombol ke dua file teks dan gunakan alat perbandingan pilihan Anda.
sumber
EmpDtl2
memiliki lebih sedikit baris daripadaEmpDtl1
dan semua baris yang ada memang ada diEmpDtl1
.