Avatar billede meltedmoon Novice
24. marts 2004 - 15:25 Der 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.

Håber nogen kan hjælpe!

Spørg endelig hvis der er noget...
Avatar billede trer Nybegynder
24. marts 2004 - 17:03 #1
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.
Avatar billede meltedmoon Novice
24. marts 2004 - 17:11 #2
Prøver om lidt...

Hvordan laver man indeks på join kriterier???
Avatar billede trer Nybegynder
24. marts 2004 - 21:08 #3
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
Avatar billede meltedmoon Novice
24. marts 2004 - 21:17 #4
Jeg får denne fejl:

The column prefix 'challenges' does not match with a table name or alias name used in the query.
Avatar billede trer Nybegynder
24. marts 2004 - 21:22 #5
I forbindelse med querien eller med indeks oprettelse?

Hvis querien, så skal du bruge det alias jeg skriver efter challenges - et C - fremfor tabel navnet.

Hvis indeks oprettelse, så skal du ikke prefixe.
Avatar billede trer Nybegynder
24. marts 2004 - 21:22 #6
der er i øvrigt en fejlagtig ) efter p1.picposition i min sql ovenfor
Avatar billede meltedmoon Novice
24. marts 2004 - 21:22 #7
okay, den fik jeg rettet, men nu kom så denne:

Invalid column name 'id'.
Avatar billede trer Nybegynder
24. marts 2004 - 21:31 #8
Betyder bare at der refereres til en ID kolonne i en tabel der ikke indeholder den.

I din SQL ovenfor ser det ud til at du angiver en ID kolonne i alle tre tabeller - men hedder den fx ID i pictures eller hedder den "kun" PicID ?
Avatar billede meltedmoon Novice
24. marts 2004 - 21:33 #9
Hmm... nu får jeg ikke nogen fejlmeddelelser, men helt forkert resultat.

Kan ikke lige gennemskue hvad det egentlig er jeg får, men det er noget andet end med min originale sqlsætning, som gav rigtigt resultat.
Avatar billede trer Nybegynder
24. marts 2004 - 21:38 #10
Jeg har brugt INNER JOIN i min sql. Dermed vil der kun komme et resultat såfremt både ID og ID2 er i brug - kan det være det?
Avatar billede meltedmoon Novice
24. marts 2004 - 21:49 #11
Nu har jeg fået det til at virke! :)

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
Avatar billede trer Nybegynder
24. marts 2004 - 21:53 #12
Tillykke :-) Håber så det også kører hurtigere...
Avatar billede trer Nybegynder
30. marts 2004 - 08:47 #13
pointtid?
Avatar billede meltedmoon Novice
30. marts 2004 - 13:53 #14
Undskyld, jeg syntes ellers jeg havde givet point... prøver igen
Avatar billede trer Nybegynder
30. marts 2004 - 14:41 #15
Intet problem - jeg synes også det med at tildele point virker lidt underligt engang i mellem..
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester