Saya memiliki LEFT OUTER yang sangat mendasar, GABUNG untuk mengembalikan semua hasil dari tabel kiri dan beberapa informasi tambahan dari tabel yang jauh lebih besar. Tabel kiri berisi 4935 catatan namun ketika saya LEFT OUTER GABUNG ke tabel tambahan jumlah catatan secara signifikan lebih besar.
Sejauh yang saya ketahui, adalah mutlak bahwa LEFT OUTER JOIN akan mengembalikan semua catatan dari tabel kiri dengan catatan yang cocok dari tabel kanan dan nilai nol untuk setiap baris yang tidak dapat dicocokkan, dengan demikian adalah pemahaman saya bahwa seharusnya mustahil untuk mengembalikan lebih banyak baris daripada yang ada di tabel kiri, tetapi itu terjadi semua sama!
SQL Query mengikuti:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits LEFT OUTER JOIN
DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
Mungkin saya telah membuat kesalahan dalam sintaksis atau pemahaman saya tentang LEFT OUTER JOIN tidak lengkap, semoga seseorang dapat menjelaskan bagaimana ini bisa terjadi?
Nota bene
Terima kasih atas jawaban yang bagus, pemahaman saya tentang LEFT OUTER JOINS sekarang jauh lebih baik, adakah yang bisa menyarankan cara query ini dapat dimodifikasi sehingga saya hanya mendapatkan sebanyak mungkin catatan yang ada di tabel sebelah kiri?
Permintaan ini murni untuk menghasilkan laporan dan kecocokan duplikat hanya membingungkan hal-hal.
/Nota bene
sumber
Jawaban:
LEFT OUTER JOIN akan mengembalikan semua rekaman dari tabel LEFT yang tergabung dengan tabel RIGHT jika memungkinkan.
Namun, jika ada kecocokan, masih akan mengembalikan semua baris yang cocok, oleh karena itu, satu baris di LEFT yang cocok dengan dua baris dalam KANAN akan kembali sebagai dua ROW, sama seperti INNER JOIN.
EDIT: Sebagai tanggapan atas hasil edit Anda, saya baru saja melihat lebih jauh pada kueri Anda dan sepertinya Anda hanya mengembalikan data dari tabel LEFT. Oleh karena itu, jika Anda hanya ingin data dari tabel LEFT, dan Anda hanya ingin satu baris dikembalikan untuk setiap baris di tabel LEFT, maka Anda tidak perlu melakukan JOIN sama sekali dan hanya dapat melakukan SELECT langsung dari tabel LEFT.
sumber
Hasil:
sumber
Bukan tidak mungkin. Jumlah catatan di tabel sebelah kiri adalah jumlah minimum catatan yang akan dikembalikan. Jika tabel kanan memiliki dua catatan yang cocok dengan satu catatan di tabel kiri, itu akan mengembalikan dua catatan.
sumber
Menanggapi naskah tambahan Anda, itu tergantung pada apa yang Anda inginkan.
Anda mendapatkan (mungkin) beberapa baris untuk setiap baris di tabel kiri Anda karena ada beberapa kecocokan untuk kondisi gabungan. Jika Anda ingin hasil total Anda memiliki jumlah baris yang sama dengan yang ada di bagian kiri kueri, Anda perlu memastikan bahwa kondisi gabungan Anda menyebabkan kecocokan 1-ke-1.
Atau, tergantung pada apa yang sebenarnya Anda inginkan, Anda dapat menggunakan fungsi agregat (jika misalnya Anda hanya menginginkan string dari bagian kanan, Anda dapat menghasilkan kolom yang merupakan string yang dibatasi koma dari hasil sisi kanan untuk baris kiri itu.
Jika Anda hanya melihat 1 atau 2 kolom dari gabungan luar, Anda mungkin mempertimbangkan untuk menggunakan subquery skalar karena Anda akan mendapatkan hasil 1 dijamin.
sumber
Setiap catatan dari tabel kiri akan dikembalikan berkali-kali karena ada catatan yang cocok di tabel sebelah kanan - setidaknya 1, tetapi bisa dengan mudah lebih dari 1.
sumber
LEFT OUTER JOIN sama seperti INNER JOIN (gabung normal) akan mengembalikan sebanyak mungkin hasil untuk setiap baris di tabel kiri sebanyak pertandingan yang ditemukan di tabel kanan. Karenanya Anda dapat memiliki banyak hasil - hingga N x M, di mana N adalah jumlah baris di tabel kiri dan M adalah jumlah baris di tabel kanan.
Ini jumlah minimum hasil selalu dijamin dalam LEFT OUTER JOIN menjadi setidaknya N.
sumber
Mungkinkah itu hubungan satu ke banyak antara tabel kiri dan kanan?
sumber
Perhatikan jika Anda memiliki klausa di mana di tabel "sisi kanan 'dari kueri yang berisi gabungan luar kiri ... Jika Anda tidak memiliki catatan di sisi kanan yang memenuhi klausa where, maka catatan terkait dari' sisi kiri ' 'tabel tidak akan muncul di hasil permintaan Anda ....
sumber
Jika Anda membutuhkan sembarang baris dari sisi kanan
atau hanya
sumber
Sepertinya ada beberapa baris dalam tabel DATA.Dim_Member per baris SUSP.Susp_Visits.
sumber
jika beberapa (x) baris di Dim_Member dikaitkan dengan satu baris di Susp_Visits, akan ada x baris di set hasil.
sumber