Query sql

martedì 22 maggio 2007 - 14.29

actarus1981 Profilo | Junior Member

Ciao a tutti.
Probabilmente la mia richiesta è una cazzata e la mancata soluzione è figlia della mia ignoranza... avrei la necessità di eliminare da una tabella le righe che hanno 2 valori inseriti in un altra tabella. In pratica sarebbe una query del tipo:

DELETE FROM tab1 WHERE val1 IN (SELECT val1 FROM tab2)

Ma fatta con 2 elementi.

Come posso fare?

Grazie

Fabio

lbenaglia Profilo | Guru

>Probabilmente la mia richiesta è una cazzata e la mancata soluzione
>è figlia della mia ignoranza...

Ciao Fabio,

"Probabilmente la risposta è una cazzata e la mancata soluzione" dipende dal fatto che non ho capito la domanda LOL

>avrei la necessità di eliminare
>da una tabella le righe che hanno 2 valori inseriti in un altra
>tabella. In pratica sarebbe una query del tipo:
>
>DELETE FROM tab1 WHERE val1 IN (SELECT val1 FROM tab2)
>
>Ma fatta con 2 elementi.
>
>Come posso fare?
Postando un esempio COMPLETO (CREATE TABLE, INSERT INTO ed il risultato che ti aspetti di ottenere con quei dati)

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

actarus1981 Profilo | Junior Member

Beh, ho due tabelle:

tab1
- nome
- cognome
- data di nascita
- cap
- comune

tab2
- data di nascita
- cap

Voglio eliminare da tab1 tutte le righe che hanno i campi data di nascita e cap presenti nella tab2

lbenaglia Profilo | Guru

>Voglio eliminare da tab1 tutte le righe che hanno i campi data
>di nascita e cap presenti nella tab2
Non ti avevo chiesto il codice SQL?

Comunque...

USE tempdb; CREATE TABLE dbo.tab1( Nome varchar(10) NOT NULL, Cognome varchar(10) NOT NULL, DataDiNascita smalldatetime NOT NULL, Cap char(5) NOT NULL, Comune varchar(10) NOT NULL ); CREATE TABLE dbo.tab2( DataDiNascita smalldatetime NOT NULL, Cap char(5) NOT NULL ); INSERT dbo.tab1 VALUES ('Lorenzo', 'Benaglia', '19710612', '20059', 'Vimercate'); INSERT dbo.tab1 VALUES ('Andrea', 'Montanari', '19661105', '47838', 'Riccione'); INSERT dbo.tab1 VALUES ('David', 'De Giacomi', '19810122', '25047', 'Darfo'); INSERT dbo.tab2 VALUES ('19710612', '20059'); INSERT dbo.tab2 VALUES ('19810122', '25047'); /* Soluzione 1 */ DELETE dbo.tab1 FROM dbo.tab1 AS T1 JOIN dbo.tab2 AS T2 ON T1.DataDiNascita = T2.DataDiNascita AND T1.Cap = T2.Cap; /* Soluzione 2 */ DELETE dbo.tab1 FROM dbo.tab1 AS T1 WHERE EXISTS( SELECT * FROM dbo.tab2 AS T2 WHERE T1.DataDiNascita = T2.DataDiNascita AND T1.Cap = T2.Cap ); SELECT * FROM dbo.tab1; /* Output: Nome Cognome DataDiNascita Cap Comune ---------- ---------- ----------------------- ----- ---------- Andrea Montanari 1966-11-05 00:00:00 47838 Riccione (1 row(s) affected) */ DROP TABLE dbo.tab1, dbo.tab2;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

fotw Profilo | Newbie

A titolo informativo::

Funziona anche una comando del tipo

DELETE FROM tab1 WHERE val1 + val2 IN (SELECT val1 + val2 FROM tab2)

cioe' concatenando i due valori facendo attenzione a fare il CONVERT di valori non alfanumerici?

Ciao

lbenaglia Profilo | Guru

>A titolo informativo::
>
>Funziona anche una comando del tipo
>
>DELETE FROM tab1 WHERE val1 + val2 IN (SELECT val1 + val2 FROM
>tab2)
>
>cioe' concatenando i due valori facendo attenzione a fare il
>CONVERT di valori non alfanumerici?

Ciao fotw,

Per funzionare, funziona, ma se vai a confrontare i piani di esecuzione di quella query rispetto alle due che ho postato in precedenza noterai che sono presenti 2 compute scalar necessari a castare l'informazione datetime a stringa.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5