Avatar billede teleskop Nybegynder
29. januar 2008 - 14:02 Der 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
Avatar billede terry Ekspert
29. januar 2008 - 14:12 #1
ALL fields must return unique values to be distinct.

http://www.w3schools.com/sql/sql_select.asp
Avatar billede fennec Nybegynder
29. januar 2008 - 14:12 #2
Distinct virker over alle valgte rækker. Er dit resultat derfor:

1, 1
1, 2
1, 2
2, 2
2, 1

Vil den med en distinct bliver:
1, 1
1, 2 <-- Den ene er her fjernet.
2, 2
2, 1
Avatar billede fennec Nybegynder
29. januar 2008 - 14:14 #3
Hvad er det du gerne vil have udtrukket??
Avatar billede teleskop Nybegynder
29. januar 2008 - 14:39 #4
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?

| 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
--------------------------------------------------------------------------

Mit ønskede resultat:

| MessageID | ReplyToMessageID | UserID  |Subject
--------------------------------------------------------------------------
|    2    |        0        |  10O    | Original subject
|    5    |        2        |  122    | RE: RE: RE: Original subject
--------------------------------------------------------------------------
Avatar billede fennec Nybegynder
29. januar 2008 - 14:48 #5
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.
Avatar billede teleskop Nybegynder
29. januar 2008 - 15:02 #6
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.
Avatar billede fennec Nybegynder
29. januar 2008 - 15:21 #7
"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.
Avatar billede teleskop Nybegynder
29. januar 2008 - 15:49 #8
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.

hmm måske noget temp tabel kan hjælpe mig...
Avatar billede fennec Nybegynder
29. januar 2008 - 15:58 #9
Group by virker også ens i MySQL og MS-SQL :o)

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.
Avatar billede teleskop Nybegynder
29. januar 2008 - 16:09 #10
Jep :) jeg vil hive den sidste række ud fordi det er den nyeste post som har 2 i ReplyMessageID.

Jeg er vandt til af MySQL (glem alt hvad jeg har skrevet om DISTINCT) at kunne sige GROUP BY ReplyMessageID ORDER BY MessageID DESC.
Avatar billede wagner Nybegynder
29. januar 2008 - 20:58 #11
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
Avatar billede teleskop Nybegynder
30. januar 2008 - 11:04 #12
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 :)
Avatar billede wagner Nybegynder
30. januar 2008 - 12:48 #13
ja, det bliver desværre noget besværligt, men det kan da lade sig gøre.

Evt. kan du lægge resultatet fra m1 ind i en temp tabel, og lave en update from på den, hvor du finder de 13 felter og updater m1 med.

Sig bare til, hvis jeg skal komme med et eksempel.

Men jeg kender desværre ikke nogen nem måde.
Avatar billede teleskop Nybegynder
01. februar 2008 - 14:56 #14
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 : )
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