27. august 2010 - 09:31Der er
9 kommentarer og 1 løsning
DISTINCT og ORDER BY
Hej,
Jeg har denne SQL-sætning hvor jeg gerne vil sortere udtrækkene tilfældigt. Problemet er at jeg får en fejl om at DISTINCT og ORDER konflikter med hinanden:
SELECT DISTINCT bruger.ID, bruger.Navn, bruger.Adresse, PostnummerTabel.PostNr, PostnummerTabel.By FROM (PostnummerTabel INNER JOIN Bruger ON (PostnummerTabel.Postnr = bruger.PostNr) AND (PostnummerTabel.Postnr = bruger.PostNr)) INNER JOIN Keywords ON bruger.ID = Keywords.brugerID WHERE (Keywords.Keyword Like '" & strKeyword & "%' OR bruger.Navn Like '" & strKeyword & "%') ORDER BY Rnd(-10000000*TimeValue(Now())*[bruger.ID])
Hvordan kan man komme uden om den? Er det noget med at man kan løse det med GROUP BY?
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Ved ikke om dette hjælper, men når jeg benytter mig af tilfældige data, eksempelvis til stikprøveudtagelse, benytter jeg denne funktion sammen med Rnd() syntaxen :
Function Randomizer() As Integer Static AlreadyDone As Integer If AlreadyDone = False Then Randomize: AlreadyDone = True Randomizer = 0 End Function
Eksempel ( tilfældigt udtræk af 5 stikprøver )
SELECT TOP 5 qryIdentificérLogData_Husejere.[LEVDØR No], qryIdentificérLogData_Husejere.JLDATE, tblDate.Year, tblDate.WeekNo FROM tblDate INNER JOIN qryIdentificérLogData_Husejere ON tblDate.OriginalDate = qryIdentificérLogData_Husejere.DATE GROUP BY qryIdentificérLogData_Husejere.[LEVDØR No], qryIdentificérLogData_Husejere.JLDATE, tblDate.Year, tblDate.WeekNo HAVING (((tblDate.Year)=[Vælg år : ]) AND ((tblDate.WeekNo)=[Vælg uge nr : ]) AND ((randomizer())=0)) ORDER BY Rnd(IsNull(qryIdentificérLogData_Husejere.[LEVDØR No])*0+1);
torotune, hvad precis siger fejlmeddelelsen? Du er vel opmaerksom paa at By er et reserveret ord i adskillige dialekter af SQL? Der bestaar den mulighed at den konfliktende faktor er at du kalder et felt By. Du har ogsaa den samme ON klausul to gange "ON (PostnummerTabel.Postnr = bruger.PostNr) AND (PostnummerTabel.Postnr = bruger.PostNr)", men det er vel blot overfloedigt uden at konflikte med noget.
Jeg testede din query i MySql fordi det er hvad jeg har til raadighed. Jeg oprettede tre tabeller torotune_bruger, torotune_PostNr, og torotune_Keywords. Jeg var noedt til at erstatte Rnd() med Rand() og TimeValue() med Timestamp(). Med disse rettelser, og ved at jeg kalte feltet "Stad" i stedet for "By" fik jeg denne query til at virke uden konflikter eller fejlmeldinger:
SELECT DISTINCT b.ID, b.Navn, b.Adresse, p.PostNr, p.Stad FROM torotune_PostNr p INNER JOIN torotune_bruger b ON p.Postnr = b.PostNr AND p.Postnr = b.PostNr INNER JOIN torotune_Keywords k ON b.ID = k.brugerID WHERE k.Keyword Like 'navn3%' OR b.Navn Like 'navn3%' ORDER BY Rand(-10000000*Timestamp(Now()));
torotune, fik du mit indlaeg? Jeg ville vaere glad for en reaktion, isaer at du giver den noejagtige ordlyd paa fejlmeldingen. Hvis du har haft tid til at teste det at undgaa det reserverede ord By som feltnavn ville det ogsaa vaere interessant at kende resultatet.
torotune, fik du kikket paa det? Spoergsmaalet er en uge gammelt nu. Det ville vaere godt enten at faa det konkluderet (lukket, med eller uden points til mig eftersom mit indlaeg viste sig at vaere nyttigt eller ikke) eller at faa dine specifikke reaktioner som man kan arbejde videre med.
Hej Christian, jeg fik ikke helt løst problemet, da jeg stadig har en konflikt mellem ORDER og DISTINCT. Men du skal have tak fordi du tog dig tid til at hjælpe og fordi du også testede det og fik det til at virke. Jeg accepterer herfor din hjælp som et svar. Mvh.
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.