PDA

Visualizza versione completa : [MYSQL] Problema subquery


Redentore
24-08-2007, 10.07.56
Ho un problema con una query inserita in una intranet che sto programmando.
La query è la seguente:

DELETE FROM
contatto a
WHERE
a.codcon IN (
SELECT
b.codcon
FROM
asscon b
WHERE
b.codper=$codper
)
AND (a.tipcon='MP'
OR a.tipcon='CP'
OR a.tipcon='SK'
)

Tale query mi restituisce questo errore:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE
a.codcon IN (
SELECT
b.codcon
FROM
asscon b
WHERE
b.codper=$codper
' at line 3
La versione di mysql è: 4.1.11
Ho già usato le subquery su questo server, e non mi hanno mai dato problemi, ma questa query non riesco proprio a farla funzionare.
Qualcuno può aiutarmi?
Grazie

erdaniele
24-08-2007, 10.53.25
Ho un problema con una query inserita in una intranet che sto programmando.
La query è la seguente:

DELETE FROM
contatto a
WHERE
a.codcon IN (
SELECT
b.codcon
FROM
asscon b
WHERE
b.codper=$codper
)
AND (a.tipcon='MP'
OR a.tipcon='CP'
OR a.tipcon='SK'
)

Tale query mi restituisce questo errore:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE
a.codcon IN (
SELECT
b.codcon
FROM
asscon b
WHERE
b.codper=$codper
' at line 3
La versione di mysql è: 4.1.11
Ho già usato le subquery su questo server, e non mi hanno mai dato problemi, ma questa query non riesco proprio a farla funzionare.
Qualcuno può aiutarmi?
Grazie

prova a riscriverla cosi':

DELETE FROM contatto
WHERE ( ( tipcon='MP'
OR tipcon='CP'
OR tipcon='SK' )
AND ( codcon IN ( SELECT codcon
FROM asscon
WHERE codper=$codper ) )

i riferimenti non sono necessari

OKKIO! pero' alcuni gestori dati non ammettono subquery / join nella istruzione DELETE !
In questo caso dovresti spezzare l'instruzione con la select esterna.

Redentore
24-08-2007, 11.20.59
FUNZIONA!!! :jump: :act:

Grazie mille!

Sapevo che c'era qualche casino con le parentesi, ma da solo non ero riuscito a trovare la soluzione.

Ancora grazie.

LoryOne
24-08-2007, 12.51.11
Cos' non va ?

DELETE FROM contatto
WHERE a.codcon IN (SELECT b.codcon FROM asscon WHERE b.codper=$codper) AND (a.tipcon='MP' OR a.tipcon='CP' OR a.tipcon='SK')

erdaniele
27-08-2007, 09.42.42
Cos' non va ?

DELETE FROM contatto
WHERE a.codcon IN (SELECT b.codcon FROM asscon WHERE b.codper=$codper) AND (a.tipcon='MP' OR a.tipcon='CP' OR a.tipcon='SK')

Dal punto di vista sintattico niente.

E' che so per esperienza che certe implementazioni del' SQL certe volte sono proprio strane.
Alcuni ( per es. DB2 IBM versione < v3.00 ) non vuole subquery nella "DELETE".

Oppure i riferimenti ( a. , b. , ecc. ) superflui possono generare problemi.

I parametri di selezione devono essere per tipo e lunghezza omogenei ai dati di tabella perche' altrimenti le conversioni automatiche generano dei casini immondi.

In alcune vecchie versioni la clausola "IN" se presente deve essere l' ultima: vai a capire perche' !

E' in sostanza un ottimo standard l'SQL ma la portabilita' a tutti i costi sopratutto in passato, secondo me , ha dato qualche problema.

cmq lo standard relazionale e' tutto un altro mondo rispetto ai vecchi modelli gerarchici o reticolari ( ancora in uso purtroppo ) le cui applicazioni spesso diventano comiche !