Jelas, Anda memiliki nilai duplikat untuk kedua kolom yang bergabung. Alih-alih produk Cartesian, [INNER] JOIN
akan menghasilkan untuk ini, Anda ingin setiap baris digunakan hanya sekali . Anda dapat mencapai ini dengan menambahkan nomor baris (rn
) per duplikat dan gabung di rn
tambahan.
Setiap tabel dapat memiliki lebih banyak atau lebih sedikit penipuan untuk nilai yang sama daripada yang lain kecuali Anda memiliki batasan tambahan (seperti batasan FK) - tetapi tidak ada pertanyaan Anda. Untuk menjaga semua baris satu akan menggunakan FULL [OUTER] JOIN
. Tetapi Anda ingin menyimpan 10.000 catatan dalam hasil, yang merupakan kardinalitas table2
. Jadi harus berupa LEFT [OUTER] JOIN
pada table1
(dengan 40 baris) - dan kecualikan kemungkinan baris yang berlebihan dari table1
.
SELECT t1."LocationArea", t2."Location"
FROM (
SELECT "Location"
, row_number() OVER (PARTITION BY "Location") AS rn
FROM table2
) t2
LEFT JOIN (
SELECT "LocationArea"
, row_number() OVER (PARTITION BY "LocationArea") AS rn
FROM table1
) t1 ON t1."LocationArea" = t2."Location"
AND t1.rn = t2.rn;
Bekerja untuk Postgres atau SQL Server. MySQL tidak mendukung fungsi jendela, Anda memerlukan pengganti:
- SQL SELECT entri terakhir tanpa batasan
Untuk lebih jelasnya:LEFT JOIN
hanyalah singkatan dari LEFT OUTER JOIN
, jadi Anda sudah menggunakan gabungan luar. Pernyataan Anda adalah kesalahpahaman :
Saya menggunakan laporan ZOHO yang tidak mendukung outer join.