Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menggunakan DISTINCT di dalam JOIN menciptakan masalah

Salah satu pendekatannya adalah menggunakan tampilan sebaris, seperti kueri yang sudah Anda miliki. Tetapi alih-alih menggunakan DISTINCT, Anda akan menggunakan GROUP BY untuk menghilangkan duplikat. Tampilan sebaris paling sederhana untuk memenuhi kebutuhan Anda adalah:

( SELECT n.item_number, n.name, n.type_code
    FROM itpitnam n
   GROUP BY n.item_number
) itpitnam

Meskipun tidak deterministik untuk baris mana dari itpitnam nilai untuk name dan type_code diambil. Tampilan sebaris yang lebih rumit dapat membuatnya lebih spesifik.

Pendekatan umum lainnya untuk jenis masalah ini adalah dengan menggunakan subquery yang berkorelasi dalam daftar SELECT. Untuk mengembalikan sekumpulan kecil baris, ini dapat bekerja dengan cukup baik. Tetapi untuk mengembalikan set besar, ada pendekatan yang lebih efisien.

SELECT i.identifier
     , i.name
     , i.subtitle
     , i.description
     , i.itemimg 
     , i.mainprice
     , i.upc
     , i.isbn
     , i.weight
     , i.pages
     , i.publisher
     , i.medium_abbr
     , i.medium_desc
     , i.series_abbr
     , i.series_desc
     , i.voicing_desc
     , i.pianolevel_desc
     , i.bandgrade_desc
     , i.category_code
     , r.overall_ranking
     , ( SELECT n1.name
           FROM itpitnam n1
          WHERE n1.item_number = r.item_number
          ORDER BY n1.type_code, n1.name
          LIMIT 1
       ) AS artist
     , ( SELECT n2.type_code
           FROM itpitnam n2
          WHERE n2.item_number = r.item_number
          ORDER BY n2.type_code, n2.name
          LIMIT 1
       ) AS type_code
  FROM itpitems i
  JOIN itprank r
    ON r.item_number = i.identifier
 WHERE mainprice > 1
 LIMIT 3

Kueri itu akan mengembalikan hasil yang ditentukan, dengan satu perbedaan signifikan. Kueri asli menunjukkan INNER JOIN ke itpitnam meja. Itu berarti bahwa satu baris akan dikembalikan HANYA jika ada baris yang cocok di itpitnam meja. Kueri di atas, bagaimanapun, mengemulasi OUTER JOIN, kueri akan mengembalikan baris ketika tidak ada baris yang cocok ditemukan di itpitnam .

PERBARUI

Untuk kinerja terbaik dari subkueri yang berkorelasi tersebut, Anda akan menginginkan indeks yang sesuai tersedia,

... ON itpitnam (item_number, type_code, name)

Indeks itu paling tepat karena merupakan "indeks penutup", kueri dapat dipenuhi sepenuhnya dari indeks tanpa merujuk halaman data di tabel yang mendasarinya, dan ada predikat kesetaraan pada kolom utama, dan ORDER BY pada dua kolom berikutnya, sehingga akan menghindari operasi "sort".

--

Jika Anda memiliki jaminan bahwa type_code atau name kolom di tabel itpitnam BUKAN NULL, Anda dapat menambahkan predikat untuk menghilangkan baris yang "hilang" dengan baris yang cocok, mis.

HAVING artist IS NOT NULL

(Menambahkan itu kemungkinan akan berdampak pada kinerja.) Tanpa jaminan semacam itu, Anda perlu menambahkan INNER JOIN atau predikat yang menguji keberadaan baris yang cocok, untuk mendapatkan perilaku INNER JOIN.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python MySQL ReferenceError:objek dengan referensi lemah tidak ada lagi

  2. Perbedaan antara Dalam database memori dan database memori disk

  3. Bagaimana saya bisa mendapatkan jumlah baris 'dikembalikan' dari kumpulan hasil prosedur tersimpan

  4. kinerja penghitungan mysql

  5. Lewati array ke rutinitas tersimpan MySQL