Saya memiliki tiga tabel, A, B, C, di mana A adalah banyak untuk satu B, dan B adalah banyak untuk satu C. Saya ingin daftar semua C di A.
Tabel-tabel saya seperti ini: A[id, nilaiA, lookupB], B[id, nilaiB, lookupC], C[id, nilaiC]. Saya telah menulis kueri dengan dua SELECT bersarang, tetapi saya bertanya-tanya apakah mungkin melakukan INNER JOIN dengan DISTINCT entah bagaimana.
SELECT valueC
FROM C
INNER JOIN
(
SELECT DISTINCT lookupC
FROM B INNER JOIN
(
SELECT DISTINCT lookupB
FROM A
)
A2 ON B.id = A2.lookupB
)
B2 ON C.id = B2.lookupC
EDIT: Tabelnya cukup besar, A adalah 500k baris, B adalah 10k baris dan C adalah 100 baris, jadi ada banyak info yang tidak perlu jika saya melakukan inner join dasar dan menggunakan DISTINCT pada akhirnya, seperti ini:
SELECT DISTINCT valueC
FROM
C INNER JOIN B on C.id = B.lookupB
INNER JOIN A on B.id = A.lookupB
Ini sangat, sangat lambat (besarnya kali lebih lambat daripada SELECT bersarang yang saya lakukan di atas.
Saya yakin hubungan 1:m Anda seharusnya sudah secara implisit membuat DISTINCT JOIN.
Tetapi, jika tujuan Anda hanya C di setiap A, mungkin lebih mudah untuk menggunakan DISTINCT pada kueri terluar.
SELECT DISTINCT a.valueA, c.valueC
FROM C
INNER JOIN B ON B.lookupC = C.id
INNER JOIN A ON A.lookupB = B.id
ORDER BY a.valueA, c.valueC
SELECT DISTINCT C.valueC
FROM C
LEFT JOIN B ON C.id = B.lookupC
LEFT JOIN A ON B.id = A.lookupB
WHERE C.id IS NOT NULL
Saya tidak melihat alasan yang bagus mengapa Anda ingin membatasi set hasil A dan B karena apa yang ingin Anda miliki adalah daftar semua C yang direferensikan oleh A. Saya melakukan perbedaan pada C.valueC karena saya menduga Anda menginginkan daftar unik dari C' s.
EDIT: Saya setuju dengan argumen Anda. Bahkan jika solusi Anda terlihat sedikit bersarang, tampaknya itu adalah cara terbaik dan tercepat untuk menggunakan pengetahuan Anda tentang data dan mengurangi set hasil.
Tidak ada konstruksi join yang berbeda yang bisa Anda gunakan, jadi tetaplah dengan apa yang sudah Anda miliki :)