Saya punya pertanyaan yang menggunakan tiga tabel pencarian untuk mendapatkan semua informasi yang saya butuhkan. Saya perlu memiliki DISTINCT
nilai untuk satu kolom, namun saya juga perlu sisa data yang terkait dengannya.
Kode SQL saya:
SELECT acss_lookup.ID AS acss_lookupID,
acss_lookup.product_lookupID AS acssproduct_lookupID,
acss_lookup.region_lookupID AS acssregion_lookupID,
acss_lookup.document_lookupID AS acssdocument_lookupID,
product.ID AS product_ID,
product.parent_productID AS productparent_product_ID,
product.label AS product_label,
product.displayheading AS product_displayheading,
product.displayorder AS product_displayorder,
product.display AS product_display,
product.ignorenewupdate AS product_ignorenewupdate,
product.directlink AS product_directlink,
product.directlinkURL AS product_directlinkURL,
product.shortdescription AS product_shortdescription,
product.logo AS product_logo,
product.thumbnail AS product_thumbnail,
product.content AS product_content,
product.pdf AS product_pdf,
product.language_lookupID AS product_language_lookupID,
document.ID AS document_ID,
document.shortdescription AS document_shortdescription,
document.language_lookupID AS document_language_lookupID,
document.document_note AS document_document_note,
document.displayheading AS document_displayheading
FROM acss_lookup
INNER JOIN product ON (acss_lookup.product_lookupID = product.ID)
INNER JOIN document ON (acss_lookup.document_lookupID = document.ID)
ORDER BY product_displayheading ASC;
Saya ingin mendapatkan semua produk dari permintaan ini, tetapi saya hanya ingin mendapatkannya sekali karena saya mengisi menu drop down untuk aplikasi pencarian. Saya ingin pengguna dapat memilih dari produk yang ada di tabel itu (itu sebabnya saya hanya perlu sekali).
Apakah ini terlalu rumit? Haruskah saya menggunakan pendekatan yang lebih sederhana?
sql-server-2005
stephmoreland
sumber
sumber
Jawaban:
Satu lagi pendekatan yang belum disebutkan adalah menggunakan fungsi jendela, misalnya row_number:
sumber
Ada beberapa cara untuk melakukan ini. Dua yang utama yang saya gunakan adalah ekspresi tabel umum dan sub-kueri. Menggunakan CTE, kueri Anda akan terlihat seperti ini:
Atau menggunakan subquery:
Saya biasanya menguji untuk melihat mana yang lebih cepat dan pergi dengan yang itu.
Saya harap ini membantu Anda.
sumber
(Saya pikir apa yang Anda coba lakukan adalah "runtuh" setiap baris hasil ke satu produk, jadi jawaban ini sesuai dengan asumsi itu.)
Ini tidak mungkin. Untuk mendapatkan data 1 .. * terkait dari tabel lain, Anda harus mengembalikan nilai duplikat di kolom lainnya.
Secara umum cara untuk menangani ini adalah dengan menjalankan query sebagaimana adanya, dan memproses hasil gabungan yang ditetapkan dalam kode aplikasi. Saya biasanya melakukan ini menggunakan pendekatan pengumpulan hash yang berakhir dengan entitas yang berbeda dari setiap jenis dalam koleksi berdasarkan nilai kunci.
Meskipun pendekatan ini biayanya lebih mahal dalam hal lalu lintas jaringan, biasanya lebih baik melakukan sesuatu seperti menjalankan beberapa kueri dan menyatukan hasilnya seperti yang Anda butuhkan dalam kode aplikasi. Itu tergantung pada banyak faktor, termasuk seberapa sering kueri / kueri berjalan dan berapa banyak data yang dikembalikan.
sumber