/ 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
Sletning af rækker i flere tabeller med sa~
Fra : Lars Kim Lund


Dato : 27-02-04 21:56


Jeg er ikke så stærk i SQL så bær over med mig hvis jeg spørger dumt.

Lad os sige jeg har tre tabeller.

tab1: id, dato
tab2: id, foo
tab3: idd, bar

id er unik og bruges som reference i de tre tabeller. Jeg ønsker at
slette alle rækker inden for et søgekriterie, f.eks. dato. Dvs.

Find id'er for dato = 2004-01-01
slet rækker i tab1, 2 og 3 hvor id = fundet ovenfor.

Jeg tænkte på bare at lave en hurtig og beskidt løsning. Dvs. først
hente alle id'er ud og så script-generere en masse delete * from tab1
where id=xx, men det må kunne gøres i ren sql og meget mere elegant.

Hvordan gør man det?

--
Lars Kim Lund
http://www.net-faq.dk/

 
 
Peter Brodersen (27-02-2004)
Kommentar
Fra : Peter Brodersen


Dato : 27-02-04 22:01

On Fri, 27 Feb 2004 21:56:10 +0100, Lars Kim Lund <lkl@fabel.dk>
wrote:

>Jeg er ikke så stærk i SQL så bær over med mig hvis jeg spørger dumt.

Hvilken SQL-server taler vi om her?

Fra MySQL 4.0 kan DELETE henvise til flere tabeller. Her angiver man
dog først hvilke tabeller, der skal slettes rækker fra, og dernæst fra
hvilke tabeller, opslaget skal laves fra:

mysql> DELETE t1, t2
FROM t1,t2,t3
WHERE t1.id = t2.id AND t2.id = t3.id;

Her slettes der rækker fra tabellerne t1 og t2.

--
- Peter Brodersen

Ugens sprogtip: På kort sigt eller på langt sigt (og ikke på sigt)

Lars Kim Lund (27-02-2004)
Kommentar
Fra : Lars Kim Lund


Dato : 27-02-04 22:17

Peter Brodersen <usenet@ter.dk> wrote:

>>Jeg er ikke så stærk i SQL så bær over med mig hvis jeg spørger dumt.
>
>Hvilken SQL-server taler vi om her?

MSSQL2k

>Fra MySQL 4.0 kan DELETE henvise til flere tabeller. Her angiver man
>dog først hvilke tabeller, der skal slettes rækker fra, og dernæst fra
>hvilke tabeller, opslaget skal laves fra:
>
>mysql> DELETE t1, t2
> FROM t1,t2,t3
> WHERE t1.id = t2.id AND t2.id = t3.id;
>
>Her slettes der rækker fra tabellerne t1 og t2.

Ok - men der mangler en krølle, udvælgelse efter dato. Hvis jeg skrev:

where t1.id = t2.id AND t2.id = t3.id AND t1.date = '2004-01-01'

vil den så vælge de rækker fra t1.date der matcher 2004-01-01 og
selecte / slette de rækker i t2 og t3 der har det samme id som i t1
(der matcher datoen).?!

--
Lars Kim Lund
http://www.net-faq.dk/

Peter Brodersen (27-02-2004)
Kommentar
Fra : Peter Brodersen


Dato : 27-02-04 23:07

On Fri, 27 Feb 2004 22:16:50 +0100, Lars Kim Lund <lkl@fabel.dk>
wrote:

>>>Jeg er ikke så stærk i SQL så bær over med mig hvis jeg spørger dumt.
>>Hvilken SQL-server taler vi om her?
>MSSQL2k

Så bliver jeg nok et svar skyldig. Jeg tror, det er en MySQL-specifik
feature (om ikke andet en specifik syntaks), på den måde at kunne
slette fra flere tabeller.

Jeg har ikke fået kigget SQL92 eller SQL99 igennem efter denne
mulighed.

>>mysql> DELETE t1, t2
>> FROM t1,t2,t3
>> WHERE t1.id = t2.id AND t2.id = t3.id;
>>
>>Her slettes der rækker fra tabellerne t1 og t2.
>
>Ok - men der mangler en krølle, udvælgelse efter dato. Hvis jeg skrev:
>
>where t1.id = t2.id AND t2.id = t3.id AND t1.date = '2004-01-01'
>
>vil den så vælge de rækker fra t1.date der matcher 2004-01-01 og
>selecte / slette de rækker i t2 og t3 der har det samme id som i t1
>(der matcher datoen).?!

Igen, ovestående er nok MySQL-specifikt. Men tanken er, at du
konstruerer en helt normal query. De rækker, der indgår i resultatet
fra de først nævnte tabeller (altså t1 og t2 i ovenstående) vil blive
slettet.

Så ja, i det tilfælde vil din tilføjelse være nok til at begrænse din
query (i MySQL).

--
- Peter Brodersen

Ugens sprogtip: På kort sigt eller på langt sigt (og ikke på sigt)

Lars Kim Lund (28-02-2004)
Kommentar
Fra : Lars Kim Lund


Dato : 28-02-04 00:31

Peter Brodersen <usenet@ter.dk> wrote:

>>>>Jeg er ikke så stærk i SQL så bær over med mig hvis jeg spørger dumt.
>>>Hvilken SQL-server taler vi om her?
>>MSSQL2k
>
>Så bliver jeg nok et svar skyldig. Jeg tror, det er en MySQL-specifik
>feature (om ikke andet en specifik syntaks), på den måde at kunne
>slette fra flere tabeller.

Er du sikker?

Det ligner den samme syntaks i MSSQL.

Deleting Rows with DELETE
The DELETE statement removes one or more rows in a table or view. A
simplified form of the DELETE syntax is:

DELETE table_or_view FROM table_sources WHERE search_condition

table_or_view names a table or view from which the rows are to be
deleted. All rows in table_or_view that meet the qualifications of the
WHERE search condition are deleted. If a WHERE clause is not
specified, all the rows in table_or_view are deleted. The FROM clause
specifies additional tables or views and join conditions that can be
used by the predicates in the WHERE clause search condition to qualify
the rows to be deleted from table_or_view. Rows are not deleted from
the tables named in the FROM clause, only from the table named in
table_or_view.

Any table that has all rows removed remains in the database. The
DELETE statement deletes only rows from the table; the table must be
removed from the database by using the DROP TABLE statement.

Tak for hjælpen til dig og Kristian.

--
Lars Kim Lund
http://www.net-faq.dk/

Peter Brodersen (28-02-2004)
Kommentar
Fra : Peter Brodersen


Dato : 28-02-04 02:03

On Sat, 28 Feb 2004 00:30:41 +0100, Lars Kim Lund <lkl@fabel.dk>
wrote:

>>Så bliver jeg nok et svar skyldig. Jeg tror, det er en MySQL-specifik
>>feature (om ikke andet en specifik syntaks), på den måde at kunne
>>slette fra flere tabeller.
>
>Er du sikker?

På ingen måde. Jeg antog blot lidt groft, at der var større
sandsynlighed for at MySQL ville bruge sin egen syntaks end en udbredt
én :) Det er i hvert fald tilfældet, hvis man skal køre en UPDATE hen
over flere tabeller - altså at MySQL og MSSQL har hver sin syntaks.

På den anden side er MSSQLs UPDATE over flere tabeller i forvejen
syntaksmæssig meget lig denne DELETE, så det ville give god mening, at
den også ku' bruges med en DELETE.

--
- Peter Brodersen

Ugens sprogtip: På kort sigt eller på langt sigt (og ikke på sigt)

Kristian Damm Jensen (28-02-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 28-02-04 00:09

Lars Kim Lund wrote:
> Jeg er ikke så stærk i SQL så bær over med mig hvis jeg spørger dumt.
>
> Lad os sige jeg har tre tabeller.
>
> tab1: id, dato
> tab2: id, foo
> tab3: idd, bar
>
> id er unik og bruges som reference i de tre tabeller. Jeg ønsker at
> slette alle rækker inden for et søgekriterie, f.eks. dato. Dvs.
>
> Find id'er for dato = 2004-01-01
> slet rækker i tab1, 2 og 3 hvor id = fundet ovenfor.
>
> Jeg tænkte på bare at lave en hurtig og beskidt løsning. Dvs. først
> hente alle id'er ud og så script-generere en masse delete * from tab1
> where id=xx, men det må kunne gøres i ren sql og meget mere elegant.
>
> Hvordan gør man det?

Standard SQL:

delete from tab2
where id in
(select id from tab1 where dato = '2004-01-01')

delete from tab3
where id in
(select id from tab1 where dato = '2004-01-01')

delete from tab1
where dato = '2004-01-01'

Afhængig af din DBMS og dine evt. krav til performance kan det være en
fordel at omskrive 'in' til 'exists'.

--
Kristian Damm Jensen damm (at) ofir (dot) dk
A password should be like a toothbrush. Use it every day; change it
regularly; and DON'T share it with friends.


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

Månedens bedste
Årets bedste
Sidste års bedste