Saya mencoba membandingkan dua tabel, SQL Server, untuk memverifikasi beberapa data. Saya ingin mengembalikan semua baris dari kedua tabel di mana data berada dalam satu atau yang lain. Intinya, saya ingin menunjukkan semua perbedaan. Saya perlu memeriksa tiga potong data untuk melakukannya, FirstName, LastName dan Product.
Saya cukup baru untuk SQL dan sepertinya banyak solusi yang saya temukan lebih rumit. Saya tidak perlu khawatir tentang NULLs.
Saya mulai dengan mencoba sesuatu seperti ini:
SELECT DISTINCT [First Name], [Last Name], [Product Name] FROM [Temp Test Data]
WHERE ([First Name] NOT IN (SELECT [First Name]
FROM [Real Data]))
Saya mengalami kesulitan untuk mengambil ini lebih jauh.
Terima kasih!
EDIT:
Berdasarkan jawaban oleh @treaschf saya telah mencoba menggunakan variasi dari kueri berikut:
SELECT td.[First Name], td.[Last Name], td.[Product Name]
FROM [Temp Test Data] td FULL OUTER JOIN [Data] AS d
ON td.[First Name] = d.[First Name] AND td.[Last Name] = d.[Last Name]
WHERE (d.[First Name] = NULL) AND (d.[Last Name] = NULL)
Tapi saya tetap mendapatkan hasil 0 kembali, ketika saya tahu bahwa setidaknya ada 1 baris di td yang tidak di d.
EDIT:
Ok, saya pikir saya sudah menemukannya. Setidaknya dalam beberapa menit pengujian saya tampaknya berfungsi cukup baik.
SELECT [First Name], [Last Name]
FROM [Temp Test Data] AS td
WHERE (NOT EXISTS
(SELECT [First Name], [Last Name]
FROM [Data] AS d
WHERE ([First Name] = td.[First Name]) OR ([Last Name] = td.[Last Name])))
Ini pada dasarnya akan memberi tahu saya apa yang ada dalam data pengujian saya yang tidak ada dalam data nyata saya. Yang benar-benar baik untuk apa yang harus saya lakukan.
Jawaban:
JIKA Anda memiliki tabel
A
danB
, keduanya dengan columC
, di sini adalah catatan, yang ada dalam tabelA
tetapi tidak dalamB
:Untuk mendapatkan semua perbedaan dengan satu permintaan, gabungan lengkap harus digunakan, seperti ini:
Apa yang perlu Anda ketahui dalam kasus ini adalah, bahwa ketika catatan dapat ditemukan di
A
, tetapi tidak diB
, dari kolom yang berasalB
akan NULL, dan juga untuk mereka, yang hadirB
dan tidak dalamA
, kolom dariA
akan menjadi nol.sumber
The objects "a.dbo.student" and "b.dbo.student" in the FROM clause have the same exposed names. Use correlation names to distinguish them.
Saya mendapatkan kesalahan jika nama tabel sama dan Anda menarik mereka dari dua basis data yang berbeda.a.dbo.student as
danb.dbo.student bs
kemudian merujuk ke tabel denganas
danbs
sumber
SELECT *
berfungsi jika ini adalah kasus untuk semua kolom; jika tidak, cukup pilih beberapa subset.Saya tahu bahwa ini mungkin bukan jawaban yang populer tetapi saya setuju dengan @Randy Minder tentang penggunaan alat pihak ketiga saat diperlukan perbandingan yang lebih kompleks.
Ini kasus khusus di sini mudah dan untuk kasus ini alat seperti itu tidak diperlukan tetapi ini bisa menjadi kompleks dengan mudah jika Anda memperkenalkan lebih banyak kolom, database pada dua server, kriteria perbandingan yang lebih kompleks dan semacamnya.
Ada banyak alat ini seperti ApexSQL Data Diff atau Quest Toad dan Anda selalu dapat menggunakannya dalam mode percobaan untuk menyelesaikan pekerjaan.
sumber
tablediff
utilitas baris perintah SQL Server yang dimaksud di sini .Untuk mendapatkan semua perbedaan antara dua tabel, Anda dapat menggunakan seperti saya permintaan SQL ini:
sumber
Variasi sederhana pada jawaban @erikkallen yang menunjukkan tabel baris mana yang ada di:
Jika Anda mendapatkan kesalahan
maka mungkin membantu untuk menambah
sumber
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
dengan pilih ini. Saya harus menambahkan'table1' as source,
bagian juga ke bagian Kecuali. - Saya mengedit jawaban untuk ini.Jika Anda ingin mendapatkan nilai kolom yang berbeda, Anda bisa menggunakan model Entity-Attribute-Value:
CONTOH SQL FIDDLE
sumber
Coba ini :
Jauh lebih mudah dibaca.
sumber
Ini akan melakukan triknya, mirip dengan solusi Tiago , kembalikan tabel "source" juga.
hasil akan berisi perbedaan antara tabel, di kolom _tabloc Anda akan memiliki referensi tabel.
sumber
Menghadirkan Cadillac of Diffs sebagai SP. Lihat di dalam untuk templat dasar yang didasarkan pada jawaban oleh @erikkallen. Ini mendukung
Pemakaian:
Kode:
sumber
Anda dapat menggunakan kecuali, misalnya sesuatu seperti ini:
sumber
Untuk tes asap sederhana di mana Anda mencoba memastikan dua tabel cocok tanpa khawatir tentang nama kolom:
Anda dapat dengan mudah menulis prosedur toko untuk membandingkan beberapa tabel.
sumber
Ada masalah kinerja yang terkait dengan gabung kiri serta gabung penuh dengan data besar.
Menurut saya ini adalah solusi terbaik:
sumber