2012-11-19 11 views
11

Byłem bardzo niechętny do publikowania tego, ponieważ uważam, że jest to częsty problem, ale nie mogę znaleźć odpowiedzi, która dotyczy tej sytuacji ... (może jestem po prostu kiepski googlera).Usuwanie oparte na kluczu złożonym z innej tabeli

Mam dwie identyczne tabele (kolumna mądra, dane nie), tabela1 i tabela2. Chcę usunąć rekordy w tabeli 1, w której klucz złożony (col1, col2) istnieje w obu tabelach. Oto, co mam, co wydaje mi się poprawne, ale rzuca błąd.

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) 

Błąd:

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

Włożyłem dwa * wokół fragmentu kodu, który ma 'Red squiggles błędach.

+0

Uważam, że to jest SQL-SERVER? – gdoron

+0

Tak, przepraszam. Powinien być bardziej szczegółowy. Tutaj w pracy po prostu odwołujemy się do SQL-SERVER jako SQL i Oracle jako Oracle. – Jeff

+0

Ponieważ Oracle jest dużo "starszy" niż serwer sql, dziwna konwencja, ale ... jeśli sprawi, że twój szef będzie szczęśliwy, a ty bogatszy, dlaczego nie! – gdoron

Odpowiedz

18

może to być czysto przeprowadzić stosując JOIN z Twojego DELETE:

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

To rozwiązanie działa, ale mam nadzieję, że mógłbyś wyjaśnić, dlaczego moje nie działa. Widziałem rozwiązania podobnych problemów, które używają składni "(col1, col2)". – Jeff

+0

@Jeff, które są ważne dla Oracle, ale nie dla serwera Sql ... używają nieco innych dialektów Sql i nie zawsze są wymienne. –

+0

To ma sens. Mógłbym przysiąc, że w pewnym momencie użyłem tej składni w SQL-Server, ale prawdopodobnie jestem w błędzie. To bałagan, który stara się zachować składnię pomiędzy SQL-Server, MySQL i Oracle. Dzięki! – Jeff

7

Które DBMS to jest? Jeśli jest w ustniku, porównanie par powinno działać.

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

Jeśli jest to serwer SQL, to rozwiązanie Michaela powinno działać.

+0

Działa to również w HSQLDB: 'usuń z tabeli 1 gdzie (col1, col2, col3) w (wybierz col1, col2, col3 z someview123 gdzie ...)' – binwiederhier

Powiązane problemy