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...
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.
meltedmoon Novice
24. marts 2004 - 17:11 #2
Prøver om lidt...

Hvordan laver man indeks på join kriterier???
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
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.
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.
trer Nybegynder
24. marts 2004 - 21:22 #6
der er i øvrigt en fejlagtig ) efter p1.picposition i min sql ovenfor
meltedmoon Novice
24. marts 2004 - 21:22 #7
okay, den fik jeg rettet, men nu kom så denne:

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

Opret Preview

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





Premium
ERP-virksomhed har indført ubegrænset ferie for alle medarbejdere - og resultatet er en succes: "Medarbejderne knokler og har et smil på læben"
ERP-virksomheden Unit4 har indført ubegrænset betalt ferie for samtlige medarbejdere verden over, hvor man som ansat nu selv kan bestemme. "Som direktør har jeg det rigtig godt med det", siger dansk landechef Anders Holm Jørgensen. Ifølge ham kan medarbejderne sagtens administrere ordningen.
Computerworld
Stein Bagger gør comeback i ny branche: "De lignede et mafiahold, førte sig frem som nyrige og plaprede løs om urealistiske drømme"
Stein Bagger har skiftet navn og fører sig nu frem i store biler i en helt ny branche, skriver en dansk avis.
CIO
Podcast: Her er seks gode råd om ledelse og digitalisering fra danske top-CIO'er
The Digital Edge: Vi har talt med 17 af Danmarks dygtigste digitale ledere - og samlet deres seks bedste råd om digitalisering og ledelse. Få alle rådene på 26 minutter i denne episode af podcasten The Digital Edge.
Job & Karriere
Se Waoos forklaring: Derfor har selskabet fyret topchef Jørgen Stensgaard med omgående virkning
Waaos bestyrelse opsiger fiberselskabets topchef, Jørgen Stensgaard, der fratræder med omgående virkning. Se hele forklaringen fra Waao her.
White paper
Sådan grundlægger du en datacenterstrategi
Covid-19 understregede behovet for at kunne administrere datacentret på afstand – og for at lade virksomhedens øvrige medarbejdere løse endnu flere opgaver hjemmefra. Det har givet en lang række erfaringer, som kan komme din organisation til gavn på jeres videre digitale rejse. Herunder om, hvordan man optimerer forbindelsen mellem applikationer og data – og om, hvordan man målrettet placerer specifikke workloads, hvor det giver den største forretningsmæssige værdi. Det kan du læse meget mere om i denne hvidbog.