2012-11-19 17 views
11

Ich habe wirklich ungern gepostet, weil ich denke, es ist ein häufiges Problem, aber ich kann nicht scheinen, eine Antwort zu finden, die für diese Situation gilt ... (vielleicht bin ich nur ein wirklich schlechter googler).Löschen basierend auf zusammengesetzten Schlüssel aus einer anderen Tabelle

Ich habe zwei identische Tabellen (Spalte weise, keine Daten), Tabelle1 und Tabelle2. Ich möchte die Datensätze in Tabelle1 löschen, in denen der zusammengesetzte Schlüssel (col1, col2) in beiden Tabellen vorhanden ist. Hier ist was ich habe, was mir richtig erscheint, aber einen Fehler wirft.

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) 

Fehler:

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

ich zwei * um den Teil des Codes gesetzt haben, die 'Red Fehler squiggles' hat.

+0

Ich glaube, das ist SQL-Server? – gdoron

+0

Ja, tut mir leid. Hätte genauer sein sollen. Hier bei der Arbeit beziehen wir uns nur auf SQL-SERVER als SQL und Oracle als Oracle. – Jeff

+0

Da Oracle ist viel "älter" als SQL-Server, seltsame Konvention, aber ... wenn es Ihren Chef glücklich und Sie reicher machen, warum nicht! – gdoron

Antwort

18

Dies kann sauber sein, unter Verwendung von JOIN mit Ihrem DELETE:

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

Diese Lösung funktioniert, aber ich hoffe, Sie könnten erklären, warum meine nicht funktionierte. Ich habe Lösungen für ähnliche Probleme gesehen, die die '(col1, col2)' - Syntax verwenden. – Jeff

+0

@ Jeff das ist gültig für Oracle, aber nicht Sql Server ... sie verwenden etwas andere Dialekte von Sql und sind nicht immer austauschbar. –

+0

Das macht Sinn. Ich hätte schwören können, dass ich diese Syntax irgendwann einmal in SQL-Server benutzt habe, aber wahrscheinlich liegt das falsch. Es ist ein Durcheinander, die Syntax zwischen SQL-Server, MySQL und Oracle aufrecht zu erhalten. Vielen Dank! – Jeff

7

Welche DBMS es ist? Wenn es in oralece ist, dann sollte paarweiser Vergleich funktionieren.

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

Wenn es SQL-Server ist, sollte Michaels Lösung funktionieren.

+0

Dies funktioniert auch in HSQLDB: 'Löschen von Tabelle1, wo (Spalte1, Spalte2, Spalte3) in (wählen Sie Spalte1, Spalte2, Spalte3 von someview123 wo ...)' – binwiederhier

Verwandte Themen