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

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
SQL delete af data i multiple tabeller
Fra : Brian Johansen


Dato : 11-04-06 10:22

Hej !

Forsøger at slette data i flere tabeller samtidig (MS SQL), men kan ikke
finde den rette SQL sætning.....

tabellerne er linket sammen vha. ctdId

delete * from testinfo, testData where
   testInfo.ctdId = testData.ctdId and
   testInfo.productName='00118' and testInfo.productRev='X1A'

Jeg kan godt udvælge data vha. select

select * from testinfo, testData where
   testInfo.ctdId = testData.ctdId and
   testInfo.productName='00118' and testInfo.productRev='X1A'

Nogen her der har en god ide ??

Mvh.

Brian

 
 
Jens Gyldenkærne Cla~ (11-04-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 11-04-06 10:31

Brian Johansen skrev:

> Forsøger at slette data i flere tabeller samtidig (MS SQL),

Hvilken version?


Du kan ikke slette i mere end én tabel ad gangen - men hvis du har
defineret kaskadesletninger i dine relationer, vil sql-serveren
selv sørge for at slette relaterede poster hvis poster i en
hovedtabel slettes.



> tabellerne er linket sammen vha. ctdId
>
> delete * from testinfo, testData where

Første fejl - * hører ikke hjemme i en deleteforespørgsel. Man kan
kun slette hele poster, derfor er det omsonst at angive hvilke
felter der skal slettes.


Hvis du vil slette på baggrund af en join-baseret forespørgsel, kan
du bruge to gange FROM:

   DELETE FROM f
   FROM foo f INNER JOIN bar b
   ON f.someID = b.someID
   WHERE b.aar < 2006

I ovenstående har jeg benyttet aliaser på tabellerne - det er ikke
nødvendigt, jeg foretrækker bare at holde sætningerne korte.

Sætningen sletter kun fra den tabel (evt. det alias) der er angivet
med den første FROM.

Eksemplet er baseret på MSSQL 2000, men virker formentlig også i
andre udgaver.
--
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

Brian Johansen (11-04-2006)
Kommentar
Fra : Brian Johansen


Dato : 11-04-06 10:56

Bruger MSSQL 2000.

> Hvis du vil slette på baggrund af en join-baseret forespørgsel, kan
> du bruge to gange FROM:
>
>    DELETE FROM f
>    FROM foo f INNER JOIN bar b
>    ON f.someID = b.someID
>    WHERE b.aar < 2006
>

Er det muligt at omformulere denne til at slette i begge tabeller på een
gang ? altså både i f og b (SomeID) baseret på kriteriet b.aar > 2006 ??

Det jeg ønsker at gøre er:
1. udvælg someID udfra en forspørgsel i tabel A
2. slet poster i både Tabel A og B hvor someID matcher


Mvh.

Brian


Jens Gyldenkærne Clausen wrote:
> Brian Johansen skrev:
>
>
>>Forsøger at slette data i flere tabeller samtidig (MS SQL),
>
>
> Hvilken version?
>
>
> Du kan ikke slette i mere end én tabel ad gangen - men hvis du har
> defineret kaskadesletninger i dine relationer, vil sql-serveren
> selv sørge for at slette relaterede poster hvis poster i en
> hovedtabel slettes.
>
>
>
>
>>tabellerne er linket sammen vha. ctdId
>>
>>delete * from testinfo, testData where
>
>
> Første fejl - * hører ikke hjemme i en deleteforespørgsel. Man kan
> kun slette hele poster, derfor er det omsonst at angive hvilke
> felter der skal slettes.
>
>
> Hvis du vil slette på baggrund af en join-baseret forespørgsel, kan
> du bruge to gange FROM:
>
>    DELETE FROM f
>    FROM foo f INNER JOIN bar b
>    ON f.someID = b.someID
>    WHERE b.aar < 2006
>
> I ovenstående har jeg benyttet aliaser på tabellerne - det er ikke
> nødvendigt, jeg foretrækker bare at holde sætningerne korte.
>
> Sætningen sletter kun fra den tabel (evt. det alias) der er angivet
> med den første FROM.
>
> Eksemplet er baseret på MSSQL 2000, men virker formentlig også i
> andre udgaver.

Jens Gyldenkærne Cla~ (11-04-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 11-04-06 11:06

Brian Johansen skrev:

> Er det muligt at omformulere denne til at slette i begge
> tabeller på een gang ?

Jeg gentager lige hvad jeg skrev i sidste post:

   Du kan ikke slette i mere end én tabel ad gangen.


> Det jeg ønsker at gøre er:
> 1. udvælg someID udfra en forspørgsel i tabel A
> 2. slet poster i både Tabel A og B hvor someID matcher


Er der en en mor-barn-relation mellem tabellerne (er someID
primærnøgle i A og fremmednøgle i B).

Hvis ja, kan posterne slettes automatisk fra B når de slettes fra
A, forudsat at der er oprettet en relation med kaskadesletninger
mellem A og B.

Alternativt kan du fyre to deletesætninger af. Det er helt
ukompliceret medmindre at joinudtrykket er nødvendigt i begge
sletninger (altså at de poster der skal udvælges fra B afhænger af
poster i A og posterne i A afhænger af poster i B). Hvis
afhængigheden kun går den ene vej, er der ikke noget problem.

NB: Læs gerne min signatur.
--
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

Brian Johansen (11-04-2006)
Kommentar
Fra : Brian Johansen


Dato : 11-04-06 11:45

>    Du kan ikke slette i mere end én tabel ad gangen.
Forstået !

> Er der en en mor-barn-relation mellem tabellerne (er someID
> primærnøgle i A og fremmednøgle i B).

Nej

> Alternativt kan du fyre to deletesætninger af. Det er helt
> ukompliceret medmindre at joinudtrykket er nødvendigt i begge
> sletninger (altså at de poster der skal udvælges fra B afhænger af
> poster i A og posterne i A afhænger af poster i B). Hvis
> afhængigheden kun går den ene vej, er der ikke noget problem.

Undskyld min nybegynder uvidenhed men forstår bare ikke helt hvordan:

select tabelA.someID from tabelA where tabelA.a > 100
delete from tabelA //someID som select sætningen udvælger
delete from tabelB //someID som select sætningen udvælger

Mvh.

Brian

Jens Gyldenkærne Cla~ (11-04-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 11-04-06 11:52

Brian Johansen skrev:

> select tabelA.someID from tabelA where tabelA.a > 100

Ovenstående select-sætning er ikke afhængig af B - kun af A.

> delete from tabelA //someID som select sætningen udvælger
> delete from tabelB //someID som select sætningen udvælger

Du skal derfor slette i omvendt rækkefølge:

   DELETE FROM b
   FROM tableA a INNER JOIN tableB b
   ON a.someID = b.someID
   WHERE a.andetfelt > 100

   DELETE FROM tableA WHERE andetfelt > 100


Hvis du er usikker på sletningerne, kan du evt. benytte en temporær
tabel til at gemme someID

   SELECT someID INTO #tblSomeID
   FROM tableA
   WHERE andetfelt > 100

   DELETE FROM b
   FROM tableB b INNER JOIN #tblSomeID t
   ON b.someID = t.someID

   DELETE FROM a
   FROM tableA a INNER JOIN #tblSomeID t
   ON a.someID = t.someID

   DROP TABLE #tblSomeID

- men den øverste model skulle være nok i dette tilfælde.
--
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

Brian Johansen (11-04-2006)
Kommentar
Fra : Brian Johansen


Dato : 11-04-06 12:25

Mange Tak det var præcist det svar jeg søgte ...

Mvh.

Brian

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

Månedens bedste
Årets bedste
Sidste års bedste