29. januar 2008 - 14:02Der er
13 kommentarer og 1 løsning
mssql 2005 og distinct
Hello,
jeg har et sql kald til en mssql 2005 db som driller.
Jeg vil undgå dubletter på mit kald, og bruger derfor funktionen DISTINCT. Men for mig virker det som om at DISTINCT kun virker når man hiver en enkelt celle ud.
her er mit simple kald som desværre ikke virker:
SELECT DISTINCT ReplyToMessageID, MessageSubject FROM Message
Præcis fennec- Distinct virker over alle valgte rækker (modsat i MySQL), men hvordan er teknikken så i MSSQL når jeg skal undgå dubletter kun på eks. ReplyToMessageID og jeg har brug for alle felter i følgende db?
Se det er netop problemet, og hvorfor distinct ikke kan bruges direkte.
Hvordan i alverden skulle databasen vide hvilken en af messagesID'erne du vil have med??
Tag f.eks dit eks. Du har 3 messagesID som passer til ReplyToMessageID=2. Hvilken en af dem vil du have med?? I dit eks er det den sidste, men er det altid sådan??
ps. Distinct skulle gerne fungere på præsis samme måde i MySQL.
Nope MySQL bruger kun DISTINCT på den første celle. Eks. vil jeg få det rigtige resultat med MySQL med følgende query, da jeg kombinere DISTINCT med ORDER BY:
SELECT DISTINCT MessageID, ReplyToMessageID, UserID, Subject FROM Message ORDER By ReplyToMessageID DESC
Men jeg kan simpelthen ikke tro at der i MSSQL ikke er en måde at undgå dubletter på hvis man hiver mere end en celle ud?
PS: GROUP BY virker også anderledes i MySQL i forhold til MSSQL.
"MySQL bruger kun DISTINCT på den første celle" Hvor har du den information fra??
Jeg indrømmer gerne at jeg ikke arbejder med MySQL hver dag, men lidt gør jeg da. Jeg har også lige kørt et eks (med dit data eks) på en MySQL, og den opføre sig præsis som jeg forventet. Hvilket vil sige på samme måde som MS-SQL.
Desuden har jeg ikke kunne finde nogen steder i MySQL manualen at distinct kun skulle køre på første kolonne. Den siger dog at distinct og distinctrow er 2 navne for den samme funktion (sikkert pga bagudkompatibilitet). Så det kan jeg kun opfatte som om at distinct kører på alle valgte kolonne.
Jep du har ret med DISTINCT :) jeg kom til at rode DISTINCT sammen med GROUP BY, hvor man i MySQL kan vælge GROUP BY på en enkelt celle modsat i MSSQL, og få det resultat som jeg efterspørger højere oppe.
Men kan det virkeligt passe at der ikke er en måde til at "merge" sit resultat sammen med i MSSQL? Man kan jo også kun GROUP'e på alle felterne i MSSQL, og virker kun som om GROUP BY er hensigstmæssigt ved aggregate functions.
Men lad os lægge den diskution til side. Hele problematikken ligge i hvilke data du vil have ud. Lad os tage dit eks: | MessageID | ReplyToMessageID | UserID |Subject -------------------------------------------------------------------------- | 2 | 0 | 10O | Original subject | 3 | 2 | 122 | RE: Original subject | 4 | 2 | 100 | RE: RE: Original subject | 5 | 2 | 122 | RE: RE: RE: Original subject --------------------------------------------------------------------------
Det vil du have til at blive: -------------------------------------------------------------------------- | 2 | 0 | 10O | Original subject | 5 | 2 | 122 | RE: RE: RE: Original subject --------------------------------------------------------------------------
Men hvorfor lige den sidste række. Hvorfor ikke: | MessageID | ReplyToMessageID | UserID |Subject -------------------------------------------------------------------------- | 2 | 0 | 10O | Original subject | 3 | 2 | 122 | RE: Original subject --------------------------------------------------------------------------
Vi skal have 100% bestemt hvilken række du vil have ud, når der er dupletter.
Du må kunne skrive: select m1.ReplyToMessageID, (select top 1 MessageID, UserID from Message m2 where m2.ReplyToMessageID = m1.ReplyToMessageID order by ReplyToMessageID desc) from Message m1 group by m1.ReplyToMessageID
Ved dog ikke om det kan gøres nemmere.
PS. jeg har skrevet det i hånden, så der kan have sneget sig et par småfejl ind. Måske subselect laves to gange - en gang for MessageID og en gang for userid
Ja det var en mulighed at gøre det sådan ....jeg tvivler dog på at det er særligt effektivt, da jeg skal hive 13 celler op, og derfor er nødt til at have 12 subqueries i en select.
Hvis jeg i dit eks. wagner bare kunne binde m2 med m1, ville det være fedt. Men jeg kan slet ikke fatte at det skal være så svært :)
Hej sorry jeg først svare nu ...fik lagt mig med noget influensa :(
Men her i dag er jeg kommet frem til at det er min db struktur som er forkert i forhold til det query jeg skal lave, så der for har jeg valgt at lave strukturen om og så kører det bare som det skal ...og det har taget under 2 timer :)
Men tak for hjælpen ...experten er sgu fedt : )
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.