2012-11-19 11 views
11

Sono stato davvero riluttante a postare questo perché ritengo che sia un problema comune, ma non riesco a trovare una risposta valida per questa situazione ... (forse sono solo un googler veramente cattivo).Elimina basato sulla chiave composita da un'altra tabella

Ho due tabelle identiche (colonna saggio, non dati), tabella1 e tabella2. Desidero cancellare i record nella tabella 1 in cui la chiave composta (col1, col2) esiste in entrambe le tabelle. Ecco quello che ho, che mi sembra corretto, ma sta commettendo un errore.

DELETE FROM Table1 
WHERE (**Col1**, Col2) IN 
(SELECT Col1, Col2 
FROM Table1 a 
JOIN Table2 b 
    ON a.Col1 = b.Col1 
    AND a.Col2 = b.Col2) 

Errore:

Msg 4145, Level 15, State 1, Line 212 An expression of non-boolean type specified in a context where a condition is expected, near ','.

ho messo due * attorno alla porzione di codice che ha 'scarabocchi rosso di errore'.

+0

Credo che questo sia SQL SERVER? – gdoron

+0

Sì, mi dispiace. Dovrebbe essere stato più specifico. Qui al lavoro ci limitiamo a fare riferimento a SQL-SERVER come SQL e Oracle come Oracle. – Jeff

+0

Dato che Oracle è molto più "vecchio" di SQL Server, una convenzione bizzarra ma ... se rende felice il tuo capo e tu sei più ricco, perché no? – gdoron

risposta

18

Questo può essere pulito eseguiti usando JOIN con il DELETE:

DELETE a 
FROM 
    Table1 a 
    JOIN Table2 b 
     ON a.Col1 = b.Col1 
     AND a.Col2 = b.Col2 
+0

Questa soluzione funziona, ma spero che tu possa spiegare perché il mio non ha funzionato. Ho visto soluzioni a problemi simili che usano la sintassi '(col1, col2)'. – Jeff

+0

@Jeff valido per Oracle, ma non Sql Server ... usano dialetti leggermente diversi di Sql e non sono sempre intercambiabili. –

+0

Questo ha senso. Avrei giurato di aver usato questa sintassi in SQL Server a un certo punto, ma probabilmente ho torto. È un casino cercare di mantenere la sintassi tra SQL-Server, MySQL e Oracle. Grazie! – Jeff

7

Quale DBMS è? Se è in uso, il confronto a coppie dovrebbe funzionare.

DELETE FROM Table1 
WHERE (Col1, Col2) IN 
(SELECT Col1, Col2 
FROM Table2) 

Se si tratta di server SQL, la soluzione di Michael dovrebbe funzionare.

+0

Funziona anche in HSQLDB: 'cancella da tabella1 dove (col1, col2, col3) in (selezionare col1, col2, col3 da someview123 dove ...)' – binwiederhier

Problemi correlati