/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Delete fra tabel - vha. SQL??
Fra : Torben Jensen


Dato : 22-05-03 13:26

Hej NG!

Jeg ved at dette måske ikke er den rette gruppe, men kunne ikke finde en
bedre. I er derfor velkommen til at "futte" mig et andet sted hen.

Jeg har en asp side, som laver en liste over et antal forekomster i en tabel
som opfylder følgende:

SELECT Bestillingsnr, Count([Bestillingsnr]) as antalDUbletter
FROM kny
GROUP BY [Bestillingsnr]
HAVING Count([Bestillingsnr])>1;

Altså en forespørgsel som udvælger alle dubletter i feltet bestillingsnr.

Efter at have udvalgt disse poster ønsker jeg nu at slette alle poster fra
min tabel med de udvalgte bestillingsnumre.
Jeg har forsøgt mig med:

DELETE FROM kny WHERE bestillingsnr IN
(SELECT Bestillingsnr, Count([Bestillingsnr]) as antalDUbletter
FROM kny
GROUP BY [Bestillingsnr]
HAVING Count([Bestillingsnr])>1 );

Her får jeg imidlertid at vide, at jeg skal bruge det reserverede or EXISTS,
men indsætter jeg det istedet for "bestillingsnr IN", så sletter den alle
mine poster i tabellen.

Er der en venlig sjæl, der kan fortælle mig hvad jeg gør forkert?

Tak for hjælpen
M.v.h.
Torben Jensen



 
 
Jens Gyldenkærne Cla~ (22-05-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 22-05-03 13:39

Torben Jensen skrev:

> Jeg ved at dette måske ikke er den rette gruppe, men kunne
> ikke finde en bedre. I er derfor velkommen til at "futte" mig
> et andet sted hen.

Spørgsmålet hører til i databasegrupen - jeg xfutter dertil.


> Altså en forespørgsel som udvælger alle dubletter i feltet
> bestillingsnr.
>
> Efter at have udvalgt disse poster ønsker jeg nu at slette
> alle poster fra min tabel med de udvalgte bestillingsnumre.

For lige at være helt sikker: Vil du slette alle poster med et
ikke-unikt bestillingsnummer eller vil du kun slette dubletterne
(alle bestillingsnumre bevares, men dubletterne fjernes)?

Det første kan relativt let gøres i SQL - det sidste er ikke så
nemt.


> DELETE FROM kny WHERE bestillingsnr IN
> (SELECT Bestillingsnr, Count([Bestillingsnr]) as
> antalDUbletter FROM kny
> GROUP BY [Bestillingsnr]
> HAVING Count([Bestillingsnr])>1 );

En in-forespørgsel må så vidt jeg husker ikke indeholde andre
felter end det du vil sammenligne med. Prøv at omskrive til:


DELETE FROM kny WHERE bestillingsnr IN
(SELECT Bestillingsnr FROM kny
GROUP BY [Bestillingsnr]
HAVING Count([Bestillingsnr])>1 )


> Her får jeg imidlertid at vide, at jeg skal bruge det
> reserverede or EXISTS, men indsætter jeg det istedet for
> "bestillingsnr IN", så sletter den alle mine poster i
> tabellen.

Hvis du skal bruge exists, skal du have en forbindelse mellem den
ydre og den indre forespørgsel. Jeg er ikke sikker på hvordan
forbindelsen skal laves når du bruger en GROUP BY-
underforespørgsel, men herunder er et bud:

DELETE FROM kny
WHERE EXISTS (
   SELECT 1
   FROM kny k2
   WHERE k2.bestillingsnr = kny.bestillingsnr
   GROUP BY Bestillingsnr
   HAVING Count(Bestillingsnr) > 1
)


> Er der en venlig sjæl, der kan fortælle mig hvad jeg gør
> forkert?

Hvis du ikke skriver et kriterie ind til at forbinde den ydre og
den indre forespørgsel, vil resultatet være at enten alle eller
også ingen poster slettes - afhængig af om den indre forespørgsel
er tom eller ej.

Jeg ville prøve med IN en gang til hvis jeg var dig.

Krydspostet til 2 grupper, opfølgning (FUT)[1] er sat til: <news:dk.edb.database>
Svar på dette indlæg henvises til nævnte gruppe og kan kun ses der
1) <http://www.usenet.dk/ord/lokal.html#fut>
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Torben Jensen (22-05-2003)
Kommentar
Fra : Torben Jensen


Dato : 22-05-03 14:15


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns9383951B9FF68jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Torben Jensen skrev:
> For lige at være helt sikker: Vil du slette alle poster med et
> ikke-unikt bestillingsnummer eller vil du kun slette dubletterne
> (alle bestillingsnumre bevares, men dubletterne fjernes)?

Du har ret. Jeg ønsker egentlig kun at slette de poster som forekommer mere
end én gang - altså alle de overskydende poster, således at jeg har en tabel
med alle mine bestillingsnumre som forekommer én og kun én gang.
>
> Det første kan relativt let gøres i SQL - det sidste er ikke så
> nemt.
>
> En in-forespørgsel må så vidt jeg husker ikke indeholde andre
> felter end det du vil sammenligne med. Prøv at omskrive til:
>
>
> DELETE FROM kny WHERE bestillingsnr IN
> (SELECT Bestillingsnr FROM kny
> GROUP BY [Bestillingsnr]
> HAVING Count([Bestillingsnr])>1 )
>
Ja, den løser rigtig nok det første scenarie du beskriver, men hvad gør jeg
når jeg ønsker at beholde en post? Kan det overhovedet lade sig gøre?

>
> > Her får jeg imidlertid at vide, at jeg skal bruge det
> > reserverede or EXISTS, men indsætter jeg det istedet for
> > "bestillingsnr IN", så sletter den alle mine poster i
> > tabellen.
>
> Hvis du skal bruge exists, skal du have en forbindelse mellem den
> ydre og den indre forespørgsel. Jeg er ikke sikker på hvordan
> forbindelsen skal laves når du bruger en GROUP BY-
> underforespørgsel, men herunder er et bud:
>
> DELETE FROM kny
> WHERE EXISTS (
> SELECT 1
> FROM kny k2
> WHERE k2.bestillingsnr = kny.bestillingsnr
> GROUP BY Bestillingsnr
> HAVING Count(Bestillingsnr) > 1
> )
>
Min GROUP BY er sådan set overflødig i min DELETE forespørgsel, hvis det
evt. hjælper.
>
>
> Hvis du ikke skriver et kriterie ind til at forbinde den ydre og
> den indre forespørgsel, vil resultatet være at enten alle eller
> også ingen poster slettes - afhængig af om den indre forespørgsel
> er tom eller ej.
>
Tak for oplysningen, det var jeg ikke klar over.

Kan du eller andre hjælpe mig videre. Andre indgangsvinkler til at få løst
problemet er også meget velkomne.
Foreløbigt tak for hjælpen

M.v.h.
Torben Jensen



Jens Gyldenkærne Cla~ (22-05-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 22-05-03 14:24

Torben Jensen skrev:

> Du har ret. Jeg ønsker egentlig kun at slette de poster som
> forekommer mere end én gang - altså alle de overskydende
> poster, således at jeg har en tabel med alle mine
> bestillingsnumre som forekommer én og kun én gang.

O.k. - så er problemet at finde ud af hvilke poster du skal
beholde. Hvis du har noget at skille dem på - fx en oprettelsesdato
eller lignende - kan du bruge max eller min til at udvælge poster
med.

Er der ikke noget at skille posterne på kan man - i hvert fald i
MSSQL - benytte en kombination af TOP og WHILE:

WHILE EXISTS (<dubletforespørgsel>)
   DELETE FROM <tabel>
   WHERE id IN (SELECT TOP 1 id FROM <dubletforespørgsel>)



> Kan du eller andre hjælpe mig videre. Andre indgangsvinkler
> til at få løst problemet er også meget velkomne.
> Foreløbigt tak for hjælpen

Jeg kan ikke lige på stående fod komme i tanke om noget bedre - men
måske kommer jeg på noget senere. Andre er selvfølgelig også
velkomne til at blande sig.
--
Jens Gyldenkærne Clausen

Torben Jensen (22-05-2003)
Kommentar
Fra : Torben Jensen


Dato : 22-05-03 15:14


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns93839CA262A58jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Torben Jensen skrev:
>
> > Du har ret. Jeg ønsker egentlig kun at slette de poster som
> > forekommer mere end én gang - altså alle de overskydende
> > poster, således at jeg har en tabel med alle mine
> > bestillingsnumre som forekommer én og kun én gang.
>
> O.k. - så er problemet at finde ud af hvilke poster du skal
> beholde. Hvis du har noget at skille dem på - fx en oprettelsesdato
> eller lignende - kan du bruge max eller min til at udvælge poster
> med.
>
> Er der ikke noget at skille posterne på kan man - i hvert fald i
> MSSQL - benytte en kombination af TOP og WHILE:
>
> WHILE EXISTS (<dubletforespørgsel>)
> DELETE FROM <tabel>
> WHERE id IN (SELECT TOP 1 id FROM <dubletforespørgsel>)
>
>
Jeg har ikke andet at udvælge fra, idet posterne er helt identiske. Der er
tale om dubletter i bogstaveligste forstand og jeg har derfor brug for at få
dem frasoreteret.

Jeg har forsøgt mig med ovenstående som jeg har omskrevet efter bedste evne
til:
WHILE EXISTS(SELECT Bestillingsnr, Count([Bestillingsnr]) as antalDUbletter
FROM kny
HAVING Count([Bestillingsnr])>1;)
DELETE FROM kny
WHERE bestillingsnr IN (SELECT TOP 1 bestillingsnr FROM (SELECT
Bestillingsnr, Count([Bestillingsnr]) as antalDUbletter
FROM kny
HAVING Count([Bestillingsnr])>1;)

Herefter får jeg at vide jeg bruger en ugyldig SQL-sætning "DELETE",
"INSERT", "UPDATE" var uventet.

M.v.h.
Torben Jensen



Torben Jensen (22-05-2003)
Kommentar
Fra : Torben Jensen


Dato : 22-05-03 15:17

Jeg skal måske lige tilføje at jeg bruger en access database og at det
sandsynligvis medfører en del begræsninger.

M:v.h.
Torben Jensen



Jens Gyldenkærne Cla~ (22-05-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 22-05-03 15:25

Torben Jensen skrev:

> Jeg har ikke andet at udvælge fra, idet posterne er helt
> identiske. Der er tale om dubletter i bogstaveligste forstand
> og jeg har derfor brug for at få dem frasoreteret.

O.k. - hvor mange poster drejer det sig om? Muligvis er en manuel
sletning hurtigere.

> Jeg har forsøgt mig med ovenstående som jeg har omskrevet
> efter bedste evne til:
> WHILE EXISTS(SELECT Bestillingsnr, Count([Bestillingsnr]) as
> antalDUbletter
> FROM kny
> HAVING Count([Bestillingsnr])>1;)

While virker ikke i Access.


> DELETE FROM kny
> WHERE bestillingsnr IN (SELECT TOP 1 bestillingsnr FROM

Her sletter du både dubletten og originalen - fordi du bruger TOP 1
på bestillingsnummeret - som jo er det samme i de to poster.

Du skal bruge en primærnøgle til det. Hvis du ikke har en, så opret
et autonummerfelt - det kan du så bruge til at skelne original og
dublet.
--
Jens Gyldenkærne Clausen

Torben Jensen (22-05-2003)
Kommentar
Fra : Torben Jensen


Dato : 22-05-03 19:11


> O.k. - hvor mange poster drejer det sig om? Muligvis er en manuel
> sletning hurtigere.

Det drejer sig om 708 poster ud af ca. 20.000
Det er en proces jeg kommer til at gå igennem mange gange, så derfor ville
det være rart hvis jeg kunne automatisere det bare en smule.
Jeg har selv tænk lidt på at hive data ud v.h.a. noget asp og her manipulere
dataene for herefter at skrive dem til en ny tabel. Jeg kan dog ikke helt
gennemskue alle konsekvenser. Har du nogen kommentarer til en sådan løsning?

>
> While virker ikke i Access.
>
Ok, det frygtede jeg
>
> > DELETE FROM kny
> > WHERE bestillingsnr IN (SELECT TOP 1 bestillingsnr FROM
>
> Her sletter du både dubletten og originalen - fordi du bruger TOP 1
> på bestillingsnummeret - som jo er det samme i de to poster.
>
> Du skal bruge en primærnøgle til det. Hvis du ikke har en, så opret
> et autonummerfelt - det kan du så bruge til at skelne original og
> dublet.

Jeg har lavet en primærnøgle i form af et autonummerfelt. Kan du uddybe
hvordan jeg kunne bruge det til at slette alle dubletter på nær én, så jeg
altid har en tilbage?

M.v.h.
Torben Jensen





Jens Gyldenkærne Cla~ (23-05-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 23-05-03 08:42

Torben Jensen skrev:

>> O.k. - hvor mange poster drejer det sig om? Muligvis er en
>> manuel sletning hurtigere.
>
> Det drejer sig om 708 poster ud af ca. 20.000

Sur bagdel - jeg kan godt se at den manuelle metode ikke lige er
det første du vælger ;)


Jeg kommer lige i tanke om en mulighed:

Lav en group by-forespørgsel med alle felterne med (gruppér sådan
at dubletposterne kun optræder én gang). Benyt denne forespørgsel
til at oprette en ny tabel. Slet den gamle og omdøb den nye til det
gamle navn.

En anden mulighed som muligvis virker i Access er blot at oprette
en nye tabel (med samme felter), sætte et unikt indeks på det felt
der ikke må være dubletter i (bestillingsnr) og så køre en rå
indsættelsesforespørgsel.

I MSSQL får man ikke lov at indsætte nogen poster hvis bare én af
de poster man prøver at indsætte ikke kan godkendes. Men så vidt
jeg husker indsætter Access så mange den kan, og melder så tilbage
hvor mange fejl der opstod.
--
Jens Gyldenkærne Clausen

Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408852
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste