26. februar 2005 - 10:16Der er
17 kommentarer og 1 løsning
Hjælp til gruop by symtax
hej Jeg har et problem med dette sql script CREATE VIEW vNyheder AS select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato, count(Nyheder_Kommentarer.Id) as Antal_Kommentar from nyheder, Nyheder_Kommentarer where Nyheder.id = Nyheder_Kommentarer.Nyhed_Id group by nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato GO
når jeg exec, får jeg denne fejl Server: Msg 306, Level 16, State 2, Procedure vNyheder, Line 3 The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
hvordan kan jeg gruop by på den måde hvis jeg ikke må havde min tekst med?
CREATE VIEW vNyheder AS select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato, kommentarer.antal as Antal_Kommentar from nyheder, ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer where Nyheder.id = Kommentarer.Nyhed_Id GO
Jeg ville i øvrigt bruge et left join til kommentarer, for ellers får du ikke de nyheder, som ikke er kommenteret (?)
Prøv så at sætte coalesce i både select og group by
CREATE VIEW vNyheder AS select nyheder.id, coalesce(nyheder.overskrift, ' '), coalesce(nyheder.tekst, ' '), nyheder.dato, count(Nyheder_Kommentarer.Id) as Antal_Kommentar from nyheder, Nyheder_Kommentarer where Nyheder.id = Nyheder_Kommentarer.Nyhed_Id group by nyheder.id, coalesce(nyheder.overskrift, ' '), coalesce(nyheder.tekst, ' '), nyheder.dato GO
Vedr. hvad coalesce gør, så er dette fra Transact-SQL Reference:
COALESCE Returns the first nonnull expression among its arguments.
Syntax COALESCE ( expression [ ,...n ] )
Arguments expression
Is an expression of any type.
n
Is a placeholder indicating that multiple expressions can be specified. All expressions must be of the same type or must be implicitly convertible to the same type.
Return Types Returns the same value as expression.
Remarks If all arguments are NULL, COALESCE returns NULL.
COALESCE(expression1,...n) is equivalent to this CASE function:
CASE WHEN (expression1 IS NOT NULL) THEN expression1 ... WHEN (expressionN IS NOT NULL) THEN expressionN ELSE NULL
så jeg har prøvet at lave en left join, men den laver en fejl som jeg ikke forstå CREATE VIEW vNyheder AS select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato, kommentarer.antal as Antal_Kommentar from nyheder, ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer --where Nyheder.id = Kommentarer.Nyhed_Id left join nyheder on nyheder.id = kommentarer.nyhed_id
Fejlen: Tables or functions 'nyheder' and 'nyheder' have the same exposed names. Use correlation names to distinguish them.
Du refererer to gange til tabellen nyheder, den ene gang i en inner join med til inline selecten, den anden gang med en left join, hvilket betyder, at du skal lave en alias på den ene af dem. F.eks.
CREATE VIEW vNyheder AS select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato, kommentarer.antal as Antal_Kommentar from nyheder, ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer --where Nyheder.id = Kommentarer.Nyhed_Id left join nyheder N on N.id = kommentarer.nyhed_id
Jeg kiggede ikke rigtigt på din SQL, men du har vist ikke implementeret din left join som veronica forestillede sig det. Prøv med:
CREATE VIEW vNyheder AS select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato, kommentarer.antal as Antal_Kommentar from nyheder LEFT JOIN ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer ON Nyheder.id = Kommentarer.Nyhed_Id
yes så virker det, men er der en mulighed for at man kan test om antal er null f.eks og hvis den er så sætte et 0 CREATE VIEW vNyheder AS select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato,
isnull(kommentarer.antal,kommentarer.antal,0) as Antal_Kommentar
from nyheder LEFT JOIN ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer ON Nyheder.id = Kommentarer.Nyhed_Id
Det er netop her COALESCE kommer ind. Den vil returnere den første af de opgivne værdier som ikke er null. Hvis du altså angiver et databasefelt og en fast værdi som parametre, vil den returnere databasefeltet hvis det ikke er null, ellers den faste værdi:
CREATE VIEW vNyheder AS select nyheder.id, nyheder.overskrift, nyheder.tekst, nyheder.dato, COALESCE(kommentarer.antal, 0) as Antal_Kommentar from nyheder LEFT JOIN ( SELECT count(id) as antal, Nyhed_Id FROM Nyheder_Kommentarer GROUP BY Nyhed_Id) as Kommentarer ON Nyheder.id = Kommentarer.Nyhed_Id
Hej igen - fik ikke lige fulgt med .. Kjulius: det lader til at du bruger COALESCE på samme måde som isNull funktionen ? Er det det samme .. ?? Håber, det kommer til at virke :)
--> veronica: Jeg bruger altid COALESCE, men jeg har lige tjekket manualen, og det synes som om, det er næsten det samme. COALESCE er en lidt udbygget version af ISNULL, ser det ud til.
COALESCE kan have flere parametre, sådan at man kan vælge det første felt, som ikke er null. Det kan f.eks. bruges til at finde en værdi blandt flere felter, hvor en bruger kan indtaste noget, men hvor man ikke kan være sikker på, at det første felt blev brugt:
COALESCE(felt1, felt2, felt3, 0), vil tjekke felterne i den angivne rækkefølge, og returnere det første felt, som ikke er null. Hvis hverken felt1, felt2 eller felt3 indeholder nogen værdi, returneres en default værdi, som her er sat til 0.
Modsat har ISNULL kun mulighed for at angive 2 parametre. Det vil selvfølgelig i de fleste tilfælde være nok, så valget er næsten frit...
Jeg håber da også, at ameq får din let modificerede SQL sætning til at virke. Jeg synes også du skulle tage at smide et svar, så kan ameq jo tage stilling til hvem han (eller er det hun?) vil give point, eller om de kan deles.
ja du var da godt på vej så hvis der ikke er nolge som får ondt i røven så syns jeg da også du skal havde en bid af kagen
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.