Saya selalu tahu tentang UNION
operator dalam SQL, tetapi hanya baru-baru ini menemukan bahwa ada set operator lain, INTERSECT
dan EXCEPT
. Saya belum dapat menemukan operator yang melakukan operator set besar keempat, perbedaan simetris (misalnya kebalikan dari INTERSECT
.)
Sepertinya saya bisa mendapatkan output yang diinginkan dengan menggunakan sesuatu seperti
SELECT Field FROM A UNION SELECT Field FROM B
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
(dengan asumsi saya mendapat hak diutamakan), atau dengan melakukan anti-full-join:
SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL
Tetapi keduanya tampak seperti pertanyaan yang agak intensif, terutama dibandingkan dengan tiga operasi dasar lainnya. Apakah ada operasi perbedaan simetris dalam SQL dan saya tidak bisa menemukannya di dokumentasi? Atau apakah ada cara "kanonik" untuk mengimplementasikannya dalam T-SQL?
sql-server
t-sql
KutuluMike
sumber
sumber
(a EXCEPT b) UNION ALL (b EXCEPT a);
mungkin lebih efisien.FULL JOIN
mungkin lebih efisien. Pengujian dapat mengungkapkan mana yang terbaik. Dan tentu saja, jika lebih banyak / kolom berbeda dari setiap tabel diperlukan, solusi saya tidak mudah diperluas.Jawaban:
Semua operator yang ada diterjemahkan ke dalam operator bergabung atau suka. Anda dapat menyaksikannya dalam rencana kueri.
Karena alasan itu, sambungan luar sepenuhnya yang Anda miliki di sana adalah yang paling efisien yang dapat Anda lakukan. Mengabaikan, tentu saja, semoga situasi yang jarang terjadi di mana pengoptimal mengambil rencana yang buruk dan penulisan ulang terjadi untuk melakukan yang lebih baik karena keberuntungan. Ini selalu bisa terjadi.
sumber
SELECT Id FROM A WHERE <stuff> EXCEPT Select Id FROM A WHERE <other stuff>
dan mendapatkan satu daftarId
. Saya tidak tahu bagaimana cara melakukannya dengan bergabung penuh ... apakah saya hanya perlu berurusan dengan memiliki dua setId
kolom dan menyatukannya kembali bersama?ISNULL(a.Col, b.Col) AS Col
. Bungkus itu dalam tabel turunan atau CTE dan Anda dapat menggunakan set hasil "terlipat" untuk operasi lebih lanjut. (Btw, saya setuju operator perbedaan simetris harus ada.)Saya pikir ini adalah solusi yang cukup bagus. Ia menggunakan gabungan semua antara dua pilihan dengan sub-kueri Tidak Ada. Lebih baik daripada menggabungkan Serikat dan Kecuali karena Anda dapat menyertakan bidang yang tidak cocok dalam proyeksi.
sumber