Jika saya mengerti dengan benar, setiap RIGHT JOIN
:
SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID
dapat dinyatakan sebagai LEFT JOIN
:
SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID
Pendapat pribadi saya adalah bahwa maksud pernyataan itu:
- Pertama dapatkan
Persons
- Kemudian perluas / ulangi
Persons
seperlunya untuk mencocokkanOrders
lebih baik diungkapkan oleh urutan Persons LEFT JOIN Orders
daripada oleh urutan terbalik Orders RIGHT JOIN Persons
(dan saya tidak pernah menggunakan RIGHT JOIN
hasilnya).
Apakah ada situasi di mana a RIGHT JOIN
lebih disukai? Atau, apakah ada kasus penggunaan di mana RIGHT JOIN
bisa melakukan sesuatu yang LEFT JOIN
tidak bisa?
database-design
sql
relational-database
Zev Spitz
sumber
sumber
RIGHT JOIN
direkomendasikan atau lebih umum. Jika itu adalah premis Anda, itu salah. Saya tidak dapat memikirkan waktu yang pernah saya lihat saat join digunakan baik dalam kode maupun dalam contoh. ItuJOIN
atauLEFT OUTER JOIN
. Dalam kasus yang jarang terjadi, Anda mungkin melihat aFULL OUTER JOIN
.Jawaban:
Itu tergantung pada persyaratan apa yang Anda coba penuhi.
Ini tidak sama dengan mengatakan: "beri aku semua orang dan pesanan mereka yang sesuai" bahwa "Saya ingin semua pesanan dengan orang yang sesuai" , terutama jika Anda akan menggunakan
is null
untuk membawa baris tanpa pertandingan yang sesuai. Itulah yang saya sebut "tabel dominan", yaitu tabel yang ingin saya ambil barisnya terlepas dari tidak ada baris yang saling berhubungan di sisi lain dari gabungan.Lihatlah gambar-gambar ini dan Anda akan melihat mereka tidak sama:
Sumber gambar adalah artikel yang luar biasa ini .
Tetapi Anda benar bahwa kedua persyaratan dapat dipenuhi dengan salah satu gabung hanya membalikkan urutan tabel di gabung.
Tetapi saya kira bahwa untuk orang barat yang terbiasa menulis dari kiri ke kanan, lebih alami menggunakan gabungan kiri daripada gabungan kanan , karena kami melihat seolah-olah kami ingin agar sambungan berada di arah yang sama atau dalam urutan yang sama dengan
select
kolom ed.Jadi alasan yang mungkin untuk memilih hak bergabung adalah karena dalam budaya Anda, Anda menulis dari kanan ke kiri (seperti dalam sistem tulisan Arab atau Ibrani) dan Anda cenderung berpikir seperti itu, artinya mungkin dalam otak Anda info teks mengalir dari kanan ke kiri .
Beberapa ahli bahasa berpikir bahasa Anda memengaruhi cara berpikir Anda: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think
sumber
LEFT JOIN
lebih alami.Tidak ada (yang saya tahu) yang bisa dilakukan dengan hak bergabung yang tidak bisa dilakukan dengan bergabung kiri. Tapi kadang-kadang sintaks dengan gabungan kiri lebih buruk. Katakanlah Anda memiliki tabel berikut:
Katakanlah Anda perlu mendapatkan daftar semua orang di database Anda dan pesanan apa pun yang mereka miliki dengan detail pesanan khusus (kami akan mengatakan bahwa tidak semua pesanan memiliki detail pesanan khusus). Jadi, Anda biasanya akan melakukan join kiri dari orang ke pesanan. Tetapi kemudian Anda harus bergabung dalam detail pesanan khusus. Jika Anda menggunakan inner join di sana, itu akan secara efektif membuat join kiri dari orang ke pesanan menjadi join internal. IE: ini yang ingin Anda lakukan tetapi tidak berhasil (ini akan mengecualikan siapa pun yang tidak memiliki pesanan khusus):
Jadi Anda dapat menulis ulang sebagai ini:
Tidak begitu jelas (dengan asumsi tidak ada komentar), tetapi itu berhasil. Jika ini adalah sesuatu yang lebih dari satu kali (mis. Sesuatu yang seseorang harus kembali dan pertahankan suatu hari nanti) menggunakan hak bergabung mungkin memperjelas apa maksudnya.
Yang sedikit lebih ringkas dan jelas (tetapi hanya jika siapa pun yang membacanya mengerti benar bergabung). Perhatikan bahwa ini dapat ditulis dengan gabungan kiri, tetapi membutuhkan gabungan bersarang (yang mungkin kurang dikenal orang daripada gabungan kanan).
Pada titik ini, ini adalah pilihan apa yang paling jelas dan apa yang kebanyakan orang akan mengerti (akankah Anda tahu bagaimana cara menggunakan sintaks google itu jika Anda tidak tahu itu disebut nested join?).
Singkatnya, Anda tidak benar-benar membutuhkan gabungan yang benar, tetapi mereka mungkin membuatnya lebih mudah dibaca.
sumber
SELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID
.Saya bisa melihat GABUNG YANG TEPAT digunakan untuk tujuan replikasi / penggabungan. Katakanlah saya memiliki dua tabel A dan B. A di sebelah kiri dan B di sebelah kanan. Katakanlah saya ingin mereplikasi data di antara kedua tabel ini untuk membuatnya setara.
Jika saya ingin menunjukkan semua data yang ada di A tetapi tidak di B itu akan menjadi bergabung KIRI. Jika saya ingin menunjukkan semua data dalam B yang tidak dalam A itu akan HAK bergabung.
Jadi, kadang-kadang KIRI dan KANAN berguna ketika menggabungkan dan mereplikasi data untuk menjaga hal-hal tetap prospektif.
Selain itu, saya tidak melihat alasan lain untuk menggunakan gabungan RIGHT karena semua RIGHT joins dapat dikonversi menjadi LEFT joins atau sebaliknya semua LEFT joins dapat dikonversi menjadi RIGHT joins tergantung pada bagaimana tabel dipesan atau divisualisasikan. Jadi, itu akan menjadi masalah pilihan dalam kasus lain.
Berikut ini tautan yang bagus untuk memvisualisasikan Bergabung SQL.
http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
sumber
join kiri bukan oposisi dari join kanan, periksa kasus berikut yang memberikan hasil berbeda
tabel b dan c selalu di dalam, tetapi di pertama dibiarkan bergabung dengan yang lain dan yang kedua bergabung
join kiri tidak menghasilkan baris saat join kanan menghasilkan satu baris
sumber
Tidak pernah ada alasan untuk memilih
RIGHT JOIN
, danLEFT JOIN
jauh lebih jelas:karena memungkinkan Anda untuk segera melihat tabel mana yang sedang ditanyakan. Sedangkan dengan
RIGHT JOIN
:tabel pertama ditulis setelah
JOIN
.Dalam pengalaman saya, saya belum pernah melihat
RIGHT JOIN
.sumber
RIGHT JOIN
? .