de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Mats Fredriksson
Mats Fredriksson
Question

Menggunakan inner join DISTINCT dalam SQL

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.

35 2008-10-02T08:48:45+00:00 3
Mats Fredriksson
Mats Fredriksson
Pertanyaan edit 2 Oktober 2008 в 9:03
Pemrograman
sql
inner-join
distinct
Pertanyaan ini memiliki :value jawaban dalam bahasa Inggris, untuk membacanya masuk ke akun Anda.
Jonathan Lonowski
Jonathan Lonowski
2 Oktober 2008 в 8:55
2008-10-02T08:55:44+00:00
Lebih
Sumber
Sunting
#8531464

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
9
0
 VVS
VVS
2 Oktober 2008 в 8:55
2008-10-02T08:55:56+00:00
Lebih
Sumber
Sunting
#8531465
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 :)

 VVS
VVS
Jawaban edit 2 Oktober 2008 в 11:49
3
0
 kristian
kristian
2 Oktober 2008 в 8:54
2008-10-02T08:54:05+00:00
Lebih
Sumber
Sunting
#8531463

Apakah ini yang Anda maksud?

SELECT DISTINCT C.valueC
FROM 
C
INNER JOIN B ON C.id = B.lookupC
INNER JOIN A ON B.id = A.lookupB
 kristian
kristian
Jawaban edit 2 Oktober 2008 в 9:11
0
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 1 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
TR
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi