Newsgroup: it.comp.lang.visual-basic
Titolo: Dubbi su sintassi SQL

Salve, vorrei sapere se qualcuno mi sa dire come poter verificare 
l'esistenza di chiavi duplicate durante una INSERT.
Ho provato l'istruzione qui sotto (in varie forme) ma ricevo sempre un 
errore: 'Punto e virgola mancante nell'istruzione SQL'.
Cn.Execute "INSERT INTO Bolle (Chiave) VALUES ('337739427') WHERE 
'337739427' NOT IN (SELECT Chiave FROM Bolle);"
In rete ho trovato alcuni esempi, ma non sono comunque riuscito a 
convertirli al mio scopo.
Grazie a mi dara' una dritta.
Paolo

 '337739427' NOT IN (SELECT Chiave FROM Bolle);"
Non l'ho provata...
Tieni conto che i nomi dei campi (o tabelle) contenenti spazi vanno
racchiusi fra quadre, non tonde. Ovviamente non č necessario se non
contengono spazi. inoltre quel ; finale non č necessario. Prova cosě:
Cn.Execute "INSERT INTO Bolle [Chiave] VALUES ('337739427') WHERE


 racchiusi fra quadre, non tonde.
Questa è la sciocchezza. Scusami e aspetta un attimo...

 
Non ho specificato che si tratta di Access 2000.
Avevo gia' provato a non mettere il punto e virgola, ma ricevevo lo  
stesso messaggio. Ho cominciato a mettere sempre i ';' in fondo alle 
query perche' una volta ho letto che gli SQL 'importanti' la vogliono, 
per cui in previsione di un eventuale upsize....
Grazie.
Paolo.

 Paolo.

 
In realta' la cosa mi e' venuta in mente leggendo un tuo (credo) post del 
2/4 ;).
<cit>
... Where chiave_univoca Not In (Select chiave_univoca From
Tabella_Destinazione).
<cit>
Da cui mi son messo a provare...
In realta' anche debuggando con Access viene fuori un messaggio di 
richiesta di conclusione della stringa prima del Where, pero' in rete ho 
visto alcuni esempi che la utilizzavano, mi pare pero' sempre da un 
database esterno e non sul medesimo.
Continuo ancora un po' a cercare, poi faccio diversamente.
Grazie
Paolo.

 database esterno e non sul medesimo.
Non è tanto il database diverso, quanto le tabelle: da una all'altra.

 
Tutto giusto, pare che non si possa fare sulla medesima tabella su cui si 
fa l'Insert.
Grazie.
Paolo.

[*Lupo* : 
LupoOrmaiR...@libero.it
] ha scritto:
Ho "rielaborato" (mischiando come un pazzo le due sintassi) e ... pare
funzionare.
... ma io, bada bene, non userò mai qualcosa del genere:
Insert Into tabella1 (citta)
Select Distinct 'abc' From tabella1
Where 'abc' Not In (Select Distinct citta From tabella1)


Il where non può essere utilizzato in una query di inserimento.
Per il tuo scopo hai due possibilità:
1. verifichi preventivamente con una query di selezione che non sia presente
una tupla con quel valore della chiave
2. esegui l'inserimento intercettando l'errore (questo lo fai da
applicazione ponendo On Error Resume Next all'inizio della sub che esegue
l'inserimento poi controllando il valore di Err.Number dopo aver eseguito la
query di INSERT)

 Insert Into tabella1 (citta)
Ora inserisci in tabella1, campo citta quanto hai prima selezionato: Se
prima non ha selezionato niente non inserisce niente, se ha selezionato,
allora ha selezionato 'abc' e lo inserisce.
Ho approfondito e (con accentuato delirio) "generalizzato" e funziona anche
con:
 Insert Into tabella1 (citta, indirizzo)
 Select Distinct 'abc', 'via piripicchio' From tabella1
 Where 'abc' & 'via piripicchio' Not In (Select Distinct citta & indirizzo
From tabella1)

 > funzionare.
<cut>
Complimenti, provo subito...
Paolo.

 
Mi sa che dovro' rassegnarmi, grazie.
Paolo.

Raynor@localhost wrote:

In SQL Server:
IF (SELECT COUNT(*) FROM Bolle WHERE Chiave='337739427')=0
    INSERT Bolle (Chiave) VALUES ('337739427')

 per cui in previsione di un eventuale upsize....
Il ; si usa per eseguire più query in successione, ma non tutti i DBMS 
lo supportano. SQL Server si.

, 
Pao...@lycos.it
 
diceva...
Ho fatto questo:
INSERT INTO Bolle (Chiave) 
        SELECT DISTINCT '10' 
        FROM Bolle 
        WHERE '10' NOT IN (SELECT DISTINCT Chiave FROM Bolle)
Non funge :(.
Cosi mi pare che quando la condizione della WHERE risulti falsa anche la 
SELECT della INSERT sara' falsa?!.
Per sicurezza ho provato anche pedissequamente il tuo esempio:
Insert Into tabella1 (citta, indirizzo)
Select Distinct 'abc', 'via piripicchio' From tabella1
Where 'abc' & 'via piripicchio' Not In (Select Distinct citta & indirizzo
From tabella1)
ma a me non inserta niente.
Comunque non mi ci sono ancora spremuto...;).
Saluti
Paolo.

 
Putroppo questa sintassi non credo sia riutilizzabile in Access :(.
Grazie.
Paolo.

 ha scritto nel messaggio
news:MPG.197b5c435...@news.tin.it


 ma a me non inserta niente.
Ripeto, in tutte le mie prove ha funzionato. Se la "chiave" (campo o
combinazione di campi) NON è già presente l'insert avviene, viceversa no,
anche se eseguito 1000 volte.

[*.* : n...@ho.mail] ha scritto:

Ma non lo pretende se il comando è uno solo. Giusto?

 Ma non lo pretende se il comando è uno solo. Giusto?
Esattamente.

 combinazione di campi) NON č gią presente l'insert avviene, viceversa no,
