Where ther is only 1 record with same name then include in select where the is more than one record with same name then dont include the on ewith lowest ID
- Rækkerne med ID 1 og 2 har samme navn. Derfor skal jeg kun udtrække rækken med ID 2. - Rækkerne med ID 3,4 og 5 har samme navn og der skal jeg kun udtrække rækkerne 4 og 5. - Rækken med ID 8 har et navn der kun forekommer én gang så den skal også med. Det samme med rækken med ID 9.
Dvs. at når der er duplikationer i Navn-kolonnen skal alle duplikationer med undtagen den første forekomst. Rækker hvor der ikke er duplikationer i Navn-kolonnen, skal også med i udtrækket.
Hvis man syntes join er pænere end "not in (xxxx)" så kan det stadig skrives som en hvis man ønsker det:
SELECT id, navn FROM navn LEFT JOIN (SELECT min(n.id) AS Minid FROM navn n GROUP BY n.navn HAVING count(n.id) > 1) as qdontsel ON navn.ID = qdontsel.Minid WHERE qdontsel.Minid is null;
Det udtræk du ønsker at lave er det man i mængdelæren kalder for en differens-sætning, og her er standarden at bruge Not Exists:
SELECT * FROM tabel AS t1 WHERE NOT EXISTS( SELECT navn FROM tabel AS t2 GROUP BY navn HAVING COUNT(*) > 1 AND Min(id) = t1.id)
I princippet er Not In lige så god, men NOT i kombination med IN sætter eventuelle indekser i din sub-select ud af kraft, og kan dermed "sløve" din forespørgsel - det gør Not Exists ikke. Ellers er eagleeyes Left Join et glimrende alternativ, bortset fra at "signal-værdien" i den måske ikke er optimal :o) (når man joiner synes jeg det signalerer et kombineret udtræk fra 2 eller flere tabeller).
eagleeye -> Nedenstående er næsten ved at være der:
SELECT navn, id FROM navn WHERE id not in (SELECT min(n.id) AS Minid FROM navn n GROUP BY n.navn HAVING count(n.id) > 1);
Hvis den køres på følgende tabel:
ID Navn 1 Navn1 2 Navn1 3 Navn2 4 Navn2 5 Navn2 6 Navn3 7 Navn3 8 Navn4 9 Navn5
...så får jeg det ønskede udtræk undtagen rækkerne med id 8 og 9. Øverste forekomst ved duplikationer bliver fjernet som ønsket, men den fjerner også rækker hvor der ikke er duplikationer i Navn-kolonnen. De rækker skal også med i udtrækket.
claesdamlund -> Den du kommer med fjerner alle duplikationer. Den bibeholder fint alle rækker hvor der ikke er duplikationer, men jeg skal have alle rækker med duplikationer(undtagen den øverste forekomst) med i udtrækket.
Ikke forstået. Jeg har lige prøvet at teste den og den udtrækker rækkerne med ID 2,4,5,7,8 og 9. Var det ikke det du ønskede, eller er der noget jeg har misforstået?
claesdam -> Jeg beklager. Der er en fejl i test tabellen. Den tabel jeg sidder med har ikke en unik ID kolonne. Er det tricky at lave sql sætningen om og få samme udtræk hvis man fjerner ID-kolonnen og kun skal bruge info fra Navn-kolonnen?
Hvis du har 3 forekomster der hedder Navn2 vil du have fjernet den øverste af dem? Hvordan ved du hvilken der er den øverste - eller ønsker du bare at fjerne én af dem?
Ja, det er jo så der jeg gerne vil have hjælp. Det er den øverste forekomst der skal fjernes. Kan det ikke gøres på en eller anden måde hvis man sorterer efter Navn?
Hvis du kun har en navnekolonne ser din tabel vel således ud:
NAVN Navn1 Navn1 Navn2 Navn2 Navn2 Navn3 Navn3 Navn4 Navn5
Det du ønsker at stå tilbage med er så;
NAVN Navn1 Navn2 Navn2 Navn3 Navn4 Navn5
Eller?? Hvis det er rigtigt forstået er det vel lige meget hvilken af forekomsterne af Navn2 du får fjernet, så længe du får fjernet én af dubletterne?
Ikke i mit tilfælde. Den test-tabel jeg lavede tidligere er en der minder om den jeg selv sidder med selv. Grunden til at jeg skal have fjernet første forekomst er at i min tabel definerer første forekomst hvad de resterende dupletter hører under. Det er en længere historie, men det er vigitgt for mig og få fjernet den første forekomst.
Man skal have en unikt ID-kolonne eller lign. for at kunne fastholde hvad for én række der skal filtreres fra. Det har jeg deværre ikke. Det er en DB tilbage fra midten af 90'erne jeg sidder med og så bare konverteret til access. De tænkte hvis ikke unikke ID kolonner den gang.
Så har du efter min bedste overbevisning et problem. Du kan selvfølgelig tilføje en ny kolonne i tabellen med en autonummerering, og dermed hurtigt få oprettet en unik ID for alle dine navne. Det er bare ikke sikkert det vil ske i den rigtige rækkefølge i forhold til den logik du søger. Men når du skriver at "i min tabel definerer første forekomst hvad de resterende dupletter hører under", så er der vel også et eller andet i tabellen som udpeger den forekomst, som definerer hvad de resterende dubletter hører under?
Ved nærmere eftertanke så bruger jeg cpr kolonnen som unik kolonne. Dem der ryger fra må så blive indtastet igen. Har lavet en SQL sætning der virker ud fra det eks. du lavede tidligere.
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.