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.