2012-11-19 44 views
11

Tôi thực sự miễn cưỡng đăng bài này bởi vì tôi cảm thấy đây là vấn đề phổ biến, nhưng dường như tôi không thể tìm ra câu trả lời áp dụng cho tình huống này ... (có thể tôi chỉ là một googler thực sự xấu).Xóa dựa trên khóa tổng hợp từ một bảng khác

Tôi có hai bảng giống hệt nhau (cột khôn ngoan, không phải dữ liệu), table1 và table2. Tôi muốn xóa các bản ghi trong bảng 1 trong đó khóa tổng hợp (col1, col2) tồn tại trong cả hai bảng. Đây là những gì tôi có, mà có vẻ đúng với tôi, nhưng là ném một lỗi.

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) 

Lỗi:

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

tôi đã đặt hai * xung quanh phần mã trong đó có 'squiggles lỗi Red'.

+0

Tôi tin đây là SQL-SERVER? – gdoron

+0

Có, xin lỗi. Nên cụ thể hơn. Ở đây tại nơi làm việc, chúng tôi chỉ đề cập đến SQL-SERVER như SQL và Oracle như Oracle. – Jeff

+0

Vì Oracle là rất nhiều "cũ" hơn sql-server, quy ước kỳ lạ nhưng ... nếu nó làm cho ông chủ của bạn hạnh phúc và bạn phong phú hơn, tại sao không! – gdoron

Trả lời

18

Điều này có thể thực hiện bằng sạch JOIN với bạn DELETE:

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

Giải pháp này hoạt động, nhưng tôi hy vọng bạn có thể giải thích tại sao tôi không làm việc. Tôi đã thấy các giải pháp cho các vấn đề tương tự sử dụng cú pháp '(col1, col2)'. – Jeff

+0

@Jeff hợp lệ đối với Oracle, nhưng không phải Sql Server ... chúng sử dụng các phương ngữ hơi khác Sql và không phải lúc nào cũng có thể hoán đổi cho nhau. –

+0

Điều đó có ý nghĩa. Tôi có thể đã thề tôi đã sử dụng cú pháp này trong SQL-Server tại một số điểm, nhưng tôi có lẽ sai. Đó là một mớ hỗn độn cố giữ cú pháp thẳng giữa SQL-Server, MySQL và Oracle. Cảm ơn! – Jeff

7

nào DBMS là nó? Nếu nó là trong uống thì so sánh cặp đôi nên làm việc.

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

Nếu đó là máy chủ SQL thì giải pháp của Michael sẽ hoạt động.

+0

Điều này cũng làm việc trong HSQLDB: 'xóa từ table1 nơi (col1, col2, col3) trong (chọn col1, col2, col3 từ someview123 nơi ...)' – binwiederhier

Các vấn đề liên quan