Avatar billede vraa Nybegynder
24. november 2006 - 14:30 Der er 17 kommentarer og
1 løsning

select distinct spørgsmål

Jeg har følgende tabel:

Kolonne1    Kolonne1    Kolonne3
DJ        A        0
E1        B        0
GR        C        2
OD        D        0
R1        F        0
R1        G        1
R2        H        2
SAM        J        0
SI        K        2
Å1        L        1
Å1        M        3
Å2        N        0
Å3        O        1

...og vil gerne have et udtræk der først vælger distinct fra kolonne1 men udtrækket skal også indeholde kolonne2 og kolonne3. Altså et udtræk der først kigger på kolonne i og vælger distinct herpå og derefter tager kolonne2 og kolonne3's data med, så udtrækket kommer til at se således ud:

Kolonne1    Kolonne1    Kolonne3
DJ        A        0
E1        B        0
GR        C        2
OD        D        0
R1        F        0
R2        H        2
SAM        J        0
SI        K        2
Å1        L        1
Å2        N        0
Å3        O        1
Avatar billede erikjacobsen Ekspert
24. november 2006 - 15:39 #1
Når der er to "Å1"-tupler, hvilken skal så vælges?
Avatar billede vraa Nybegynder
25. november 2006 - 15:38 #2
Den første :-)
Avatar billede erikjacobsen Ekspert
25. november 2006 - 15:47 #3
Så må jeg spørge igen: hvad definerer "den første" ? Der er som udgangspunkt ingen naturlig rækkefølge i en tabel.
Avatar billede vraa Nybegynder
25. november 2006 - 16:06 #4
Det er et fedt om det er den 1., 2., 3. osv forekomst af f.eks. Å1. Bare den vælger en af rækkerne og sorterer andre rækker med Å1 i kolonne1 væk.
Avatar billede vraa Nybegynder
25. november 2006 - 16:06 #5
sorterer = fjerner :-)
Avatar billede erikjacobsen Ekspert
25. november 2006 - 16:16 #6
Godt nok - vi nærmer os. Men tillad mig at være nysgerrig: hvorfor er det ligemeget om den viser "L 1" eller "N 0" ?
Avatar billede erikjacobsen Ekspert
25. november 2006 - 16:16 #7
...om den viser "L 1" eller "M 3" ?
Avatar billede erikjacobsen Ekspert
25. november 2006 - 16:36 #8
Men hov: hvad er primærnøglen på din tabel?
Avatar billede vraa Nybegynder
25. november 2006 - 17:16 #9
Der er nemlig ikke nogen primær nøgle. Det er en gammel pervasive database hvor der ikke blev tænkt på det dengang.
Det er pga der er nogle andre kolonner som skal med som indeholder nogen værdier der skal medbrignes i udtrækket. Det tre kolonner udgør blot de kolonner som jeg har og isolere dataen på.
Avatar billede erikjacobsen Ekspert
25. november 2006 - 19:18 #10
Ok, så har jeg ikke noget liggende i skuffen. Man laver ikke tabeller uden primærnøgler, hvis man efterfølgende skal bruge SQL-sætninger på dem.

Kan du lave en Identity (autoincrement) kolonne som primærnøgle, så skulle det kunne lade sig gøre. Ellers gider jeg ikke ;)
Avatar billede vraa Nybegynder
25. november 2006 - 20:08 #11
Desværre ikke muligt da et program er bygget op præcis efter den tabel struktur. HVerken mere eller mindre :-)
Havde der været en primær nøgle ville jeg også selv kunne knække den, men tak for indsatsen.

Er der andre der har et forslag?
Avatar billede erikjacobsen Ekspert
25. november 2006 - 20:36 #12
Du kan programmere dig ud af det i et bagvedliggende programmeringssprog - det kan man jo altid. SQL uden primærnøgler, er det man får mareridt af om  natten...
Avatar billede vraa Nybegynder
26. november 2006 - 09:37 #13
Jep... Det bliver også det sidste alternativt. Synes bare ikke det er så "kønt"
Avatar billede ramad Praktikant
26. november 2006 - 14:46 #14
Du kan jo evt. gøre det med en temp tabel. I så fald kunne det se ud på følgende måde. Det giver det resultatsæt du gerne vil se.

Jeg har kaldt "din" tabel for Eksperten_Select_Distinct :)

---------------------------------------------------------------------
CREATE TABLE #Kolonne_Temp(Kolonne1 nvarchar(10),Kolonne2 nvarchar(10),Kolonne3 nvarchar(10))

INSERT INTO #Kolonne_Temp(kolonne1)
SELECT DISTINCT Kolonne1
FROM Eksperten_Select_Distinct

UPDATE #Kolonne_Temp
SET Kolonne2 = b.Kolonne2
FROM #Kolonne_Temp a INNER JOIN Eksperten_Select_Distinct b
ON a.Kolonne1 = b.Kolonne1

UPDATE #Kolonne_Temp
SET Kolonne3 = b.Kolonne3
FROM #Kolonne_Temp a INNER JOIN Eksperten_Select_Distinct b
ON a.Kolonne1 = b.Kolonne1

SELECT * FROM #Kolonne_Temp

DROP TABLE #Kolonne_Temp
---------------------------------------------------------------------
Avatar billede arne_v Ekspert
26. november 2006 - 15:01 #15
garanterer SQLServer at de 2 sidste UPDATE altid vil hente kolonne2 og kolonne3 fra
samme række til en give kolonne1 værdi ?
Avatar billede ramad Praktikant
26. november 2006 - 15:16 #16
God pointe. Vi tilføjer en AND (AND a.Kolonne2 = b.Kolonne2) i det andet UPDATE.

---------------------------------------------
CREATE TABLE #Kolonne_Temp(Kolonne1 nvarchar(10),Kolonne2 nvarchar(10),Kolonne3 nvarchar(10))

INSERT INTO #Kolonne_Temp(kolonne1)
SELECT DISTINCT Kolonne1
FROM Eksperten_Select_Distinct

UPDATE #Kolonne_Temp
SET Kolonne2 = b.Kolonne2
FROM #Kolonne_Temp a INNER JOIN Eksperten_Select_Distinct b
ON a.Kolonne1 = b.Kolonne1

UPDATE #Kolonne_Temp
SET Kolonne3 = b.Kolonne3
FROM #Kolonne_Temp a INNER JOIN Eksperten_Select_Distinct b
ON a.Kolonne1 = b.Kolonne1
AND a.Kolonne2 = b.Kolonne2

SELECT * FROM #Kolonne_Temp

DROP TABLE #Kolonne_Temp
---------------------------------------------
Avatar billede vraa Nybegynder
27. november 2006 - 09:49 #17
ramad -> Det virker. Lidt en workaround men sådan er det jo med tabeller uden primær nøgler. Et helvede...
Læg et svar så får du point :-)
Avatar billede ramad Praktikant
27. november 2006 - 10:18 #18
Et stk svar - og glad for at du kunne bruge det :)
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



IT-JOB

Udviklings- og Forenklingsstyrelsen

Kontorchef med ansvar for tværgående service management

Udviklings- og Forenklingsstyrelsen

Systemejer/Application Manager til SAP-installationer

Udlændinge- og Integrationsministeriet

Contract Managers til kontrakt- og leverandørstyring

Udviklings- og Forenklingsstyrelsen

Business Analyst med drive og gåpåmod

Udviklings- og Forenklingsstyrelsen

Generalist med flair for økonomi i projekter og drift