Optimizare selectați distincte

(Conform articolului Neil Boyle la swynk.com "Speed ​​up SELECT interogări DISTINCT")

Neil spune că mulți oameni folosesc opțiunea DISTINCT într-o declarație selectați pentru a filtra duplicate. De exemplu, o simplă cerere pentru baza de date EDITORI:

selectați DISTINCT
au_fname,
au_lname
de la autori

selectați DISTINCT
au_fname,
au_lname
de la autori un join titleAuthor T
pe t.au_id = a.au_id

selectați au_fname, au_lname
de la autori un
în cazul în care există (
selectați *
din titleAuthor t
unde t.au_id = a.au_id
)

selectați o.name DISTINCT
de la sysobjects o
se alăture sysindexes I
pe o.id = i.id
unde o.type = 'U'

selectați o.name
de la sysobjects o
unde o.type = 'U'
și există (
selectați 1
de la sysindexes I
unde o.id = i.id
)

Trebuie să înțeleagă caracteristicile unirea a două (sau mai multe) tabele, să-l folosească pentru punerea în aplicare efectivă. Următoarele două interogări la baza de date Northwind concepute pentru a reveni ID-ul clientului, care este setat pe mai mult de 2 la suta pentru orice poziție. La prima vedere, se vor comporta la fel ca și în exemplul anterior (formate de interogare similare), dar rezultatele reale vor fi obținute de către alții.

selectați DISTINCT cod de client
din ordinele de o
te înscrii în [detaliile comenzii] od
pe o.OrderID = od.OrderID
în cazul în care o reducere> 0,02

selectați din ordinele o cod de client
în cazul în care există (
selectați *
de la [detaliile comenzii] od
unde o.OrderID = od.OrderID
și reducere> 0,02
)

Eficacitatea diferență a punerii în aplicare a acestor cereri că IDComandă, care definește relația dintre cele două tabele, nu numele clientului. A doua interogare va returna setul de numele clientului - unul pentru fiecare poziție obținută de către client. Încercați să adăugați coloana IDComandă din lista SELECT pentru ao vedea.