Alasan untuk lebih suka BERGABUNG KANAN daripada BERGABUNG

18

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 Personsseperlunya untuk mencocokkanOrders

lebih baik diungkapkan oleh urutan Persons LEFT JOIN Ordersdaripada oleh urutan terbalik Orders RIGHT JOIN Persons(dan saya tidak pernah menggunakan RIGHT JOINhasilnya).

Apakah ada situasi di mana a RIGHT JOINlebih disukai? Atau, apakah ada kasus penggunaan di mana RIGHT JOINbisa melakukan sesuatu yang LEFT JOINtidak bisa?

Zev Spitz
sumber
12
Saya tidak dapat mengingat satu kasus di mana saya ingin hak bergabung. Saya memiliki kasus di mana rencana pelaksanaan kueri membalik gabung kiri menjadi gabung kanan karena alasan kinerja. Tetapi dari sudut pandang penulisan kode murni, tidak, saya tidak ingat pernah menulis hak bergabung.
Brandon
2
Saya tidak melihat ini sebagai pertanyaan tentang "menjelaskan, menulis atau men-debug kode". Ia bertanya mengapa suatu bahasa memiliki dua fitur yang tampaknya melakukan hal yang sama, jika sebenarnya ada perbedaan di antara mereka, dan jika tidak ketika yang "tidak jelas" satu akan lebih disukai.
Philip Kendall
1
Tidak, join kiri hampir selalu menangkap apa yang paling Anda butuhkan secara ringkas dan lebih mudah untuk dipikirkan. Di tempat kerja saya, kami benar-benar memiliki standar untuk mencegah bergabung dengan benar karena tidak pernah ada kasus di mana mereka diperlukan (yaitu mereka selalu dapat digantikan oleh gabung kiri yang berlawanan).
mgw854
8
Saya telah mereset suara tutup - pertanyaan ini ada di topik, karena memahami perbedaan antara gabungan mempengaruhi desain perangkat lunak (desain basis data adalah bagian dari desain perangkat lunak, seperti halnya algoritma yang dapat meminta basis data). Mungkin juga pada topik di Administrator Database , dan mungkin ada duplikat di sana juga.
Thomas Owens
1
Saya tidak yakin apakah Anda menyarankan yang RIGHT JOINdirekomendasikan 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. Itu JOINatau LEFT OUTER JOIN. Dalam kasus yang jarang terjadi, Anda mungkin melihat a FULL OUTER JOIN.
JimmyJames

Jawaban:

12

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 nulluntuk 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:

masukkan deskripsi gambar di sini

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 selectkolom 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

Tulains Córdova
sumber
1
Saya mulai berpikir seperti itu, tetapi saya pikir itu tidak benar. Saya mulai membayangkan menulis SQL dalam bahasa Ibrani (yang belum pernah saya lakukan). OK: benar dibenarkan, kanan-ke-kiri, top-down. Anda masih akan menyebutkan tabel A pertama dari tabel B. Dengan hak bergabung, Anda kemudian akan mengecualikan (terutama dalam kasus nol) sebagian besar atau semua tabel yang disebutkan pertama. Saya berpikir bahwa pikiran manusia cenderung bergaul pertama dengan yang utama dan paling penting . Ini terjadi terlepas dari arah penulisan. Anda dapat memanggil mereka "GABUNGAN PERTAMA" dan "GABUNGAN KEDUA" dan bias ini masih akan terjadi.
Mike Mendukung Monica
Saya telah menyertakan tautan ke gambar yang telah Anda tunjukkan di bawah ini.
Jon Raynor
@ Mike Saya tidak menyarankan orang menulis SQL dalam bahasa Arab atau ibrani. Hanya saja mungkin orientasi bahasa ibu Anda bisa menjadi alasan bagi Anda untuk lebih suka bergabung dengan benar. Tapi itu hanya kemungkinan. Saya menemukan kiri bergabung lebih alami.
Tulains Córdova
Sekarang saya memberikan kredit kepada pencipta gambar. Saya sudah memilikinya selama bertahun-tahun dalam HD saya dan saya tidak ingat dari mana asalnya,
Tulains Córdova
Saya fasih berbahasa Ibrani dan saya masih menemukan yang LEFT JOINlebih alami.
Zev Spitz
3

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:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

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):

select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

Jadi Anda dapat menulis ulang sebagai ini:

--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null 

union

--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

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.

select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId

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).

select p.*, o.*, d.*
from Persons p
left join Orders o 
    inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id

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.

Becuzz
sumber
Saya pikir mungkin Anda hanya kidal.
Robert Harvey
Saya tidak mengikuti mengapa Anda tidak bisa menulis beberapa kiri bergabung dalam kasus ini: 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.
Zev Spitz
@RobertHarvey, saya, tetapi saya tidak yakin apa yang harus dilakukan dengan menyerahkannya.
Becuzz
@ ZevSpitz Mungkin tidak jelas dari apa yang saya tulis, tetapi idenya adalah Anda hanya ingin bidang dari pesanan hanya jika catatan detail pesanan khusus ada, yaitu. tinggalkan gabung hanya jika pasangannya ada.
Becuzz
-1

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

Jon Raynor
sumber
-1

join kiri bukan oposisi dari join kanan, periksa kasus berikut yang memberikan hasil berbeda

select * from 
(select 1 as x  where 1=1) a left join 
(select 1 as x  where 1=0) b on a.x=b.x inner join 
(select 1 as x  where 1=1) c on b.x=c.x

select * from 
(select 1 as x where 1=1) c inner join 
(select 1 as x where 1=0) b on c.x=b.x right join 
(select 1 as x where 1=1) a on b.x=a.x

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

jacob s
sumber
ini berbunyi lebih seperti komentar tangensial, lihat Cara Menjawab
nyamuk
-2

Tidak pernah ada alasan untuk memilih RIGHT JOIN, dan LEFT JOINjauh lebih jelas:

PILIH Orang. *, Pesanan. * DARI ORANG KIRI, GABUNG Pesanan PADA Orang.ID = Pesanan.Pribadi

karena memungkinkan Anda untuk segera melihat tabel mana yang sedang ditanyakan. Sedangkan dengan RIGHT JOIN:

PILIH Orang. *, Pesanan. * DARI Pesanan, BERGABUNG DENGAN BENAR Orang, Pesanan.PersonID = Orang.ID

tabel pertama ditulis setelah JOIN.

Dalam pengalaman saya, saya belum pernah melihat RIGHT JOIN.

kirie
sumber
1
Apa yang ini tambahkan pada pertanyaan? Pertanyaannya bukan apa bedanya? ; Pertanyaannya adalah mengapa saya harus menggunakan RIGHT JOIN? .
Zev Spitz
@ ZevSpitz Anda meminta alasan untuk memilih yang mana, saya berikan alasan. Kasus penggunaan mana yang tidak masalah karena itu masalah selera.
kirie