24. marts 2004 - 15:25Der er
14 kommentarer og 1 løsning
SQL-sætning forkortelse
Jeg har en SQL-sætning, som højst sandsynligt kan forkortes ned og performance-optimeres. Jeg ved dog ikke helt hvordan... Jeg vil meget gerne have noget hjælp til dette.
Den ser således ud:
SELECT challenges.challengeID, (SELECT pictures.picID FROM pictures WHERE challenges.ID2 = pictures.ID AND (pictures.picposition=1 OR pictures.picposition IS NULL)) AS gal2picid, (SELECT gallerier.mærke FROM gallerier WHERE challenges.ID2 = gallerier.ID) AS gal2mærke, (SELECT gallerier.model FROM gallerier WHERE challenges.ID2 = gallerier.ID) AS gal2model, (SELECT gallerier.årgang FROM gallerier WHERE challenges.ID2 = gallerier.ID) AS gal2årgang, (SELECT gallerier.ID FROM gallerier WHERE challenges.ID2 = gallerier.ID) AS gal2ID, gallerier.ID AS gal1ID, gallerier.mærke AS gal1mærke, gallerier.model AS gal1model, gallerier.årgang AS gal1årgang, pictures.picid AS gal1picid, pictures.picposition AS gal1picposition FROM pictures, gallerier, challenges WHERE gallerier.aktiv = 1 AND gallerier.acceptVote = 1 AND gallerier.ID = pictures.ID AND (pictures.picposition=1 OR pictures.picposition IS NULL) AND challenges.ID1 = gallerier.ID AND challenges.active = 1 AND challenges.ID2accept = 1 AND challenges.EndDate > getdate() AND challenges.ID2 IN (SELECT gallerier.ID FROM gallerier WHERE challenges.ID2 = gallerier.ID AND gallerier.aktiv = 1 AND gallerier.acceptVote = 1) ORDER BY (et eller andet)
Jeg vil helst gerne undgå alle de interne select-sætninger, men har ikke lige kunnet finde ud af hvordan jeg ellers henter 2 forskellige records fra samme tabel og kalde felterne hver sit navn.
I stedet for din fremgangsmåde kan du lave noget i denne stil:
select p1.id as gal1picid, p2.id as gal2picid, g1.mærke as gal1mærke, g2.mærke as gal2mærke, g1.model as gal1model, g2.model as gal2model, g1.årgang as gal1årgang, g2.årgang as gal2årgang, p1.picposition) as gal1picposition, p2.picposition as gal1picposition from challenges c inner join pictures p1 on c.id = p1.id and isnull(p1.picposition,1)=1 inner join pictures p2 on c.id2 = p2.id and isnull(p2.picposition,1)=1 inner join galleries g1 on c.id = g1.id and g1.acceptvote=1 and g1.aktiv=1 inner join galleries g2 on c.id2 = g2.id and g2.acceptvote=1 and g2.aktiv=1 where c.id2accept=1 and c.active=1 and c.EndDate > getdate() order by (et eller andet)
god performance får du først ved at lægge indeks på alle join kriterier (kolonner der joines på) og where betingelser samt order by kolonnerne.
Du kan lægge indeks på via enterprise manager - umiddelbart er det kolonnerne challenges.id, challenges.id2, pictures.picposition, galleries.acceptvote, galleries.aktiv, challenges.enddate, challenges.id2accept og challenges.active du skal have fat i.
Åbn tabellen i design mode og vælg properties - så kan du oprette indeks på de enkelte kolonner. Et indeks kan godt dække flere kolonner og muligvis er det en fordel ved id2accept, active samt acceptvote og aktiv
Der var lige nogle små fejl hist og her, men det virker helt fint nu.
Sådan skal det se ud:
"select challenges.challengeID, p1.picid as gal1picid, p2.picid as gal2picid, g1.ID AS gal1ID, g2.ID AS gal2ID, g1.mærke as gal1mærke, g2.mærke as gal2mærke, g1.model as gal1model, g2.model as gal2model, g1.årgang as gal1årgang, g2.årgang as gal2årgang, p1.picposition as gal1picposition, p2.picposition as gal2picposition from challenges challenges inner join pictures p1 on challenges.id1 = p1.id and isnull(p1.picposition,1)=1 inner join pictures p2 on challenges.id2 = p2.id and isnull(p2.picposition,1)=1 inner join gallerier g1 on challenges.id1 = g1.id and g1.acceptvote=1 and g1.aktiv=1 inner join gallerier g2 on challenges.id2 = g2.id and g2.acceptvote=1 and g2.aktiv=1 where challenges.id2accept=1 and challenges.active=1 and challenges.EndDate > getdate() ORDER BY " & sorting
Intet problem - jeg synes også det med at tildele point virker lidt underligt engang i mellem..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.