2011-09-04 69 views
9

Tôi có truy vấn MySQL sau:MySQL xóa với lựa chọn truy vấn lồng nhau

DELETE FROM catalogue 
WHERE catalogue_id IN (
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
) 
) 

Nhưng khi tôi cố gắng để thực hiện tôi nhận được thông báo lỗi sau:

Bạn không thể chỉ định bảng mục tiêu ' danh mục 'để cập nhật trong mệnh đề FROM

Có thể ai đó khuyên tôi nên đi đâu không?

Trả lời

13

Thực hiện đôi làm tổ

DELETE FROM catalogue 
WHERE catalogue_id IN (SELECT catalogue_id FROM (
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
)) x 
) 

Nó đánh lừa mysql

+0

Hoạt động hoàn toàn zerkm, nhưng lý do khiến bạn phải 'đánh lừa' MySQL là gì? –

+0

Còn nếu bạn có nhiều cột 'WHERE' thì sao? tức là 'DELETE FROM catalog WHERE catalogue_id AND catalogue_name IN ... ' – ThreaT

+0

@ThreaT: Tôi không chắc bạn đang hỏi về điều gì. Nhiều vị từ có thể được thêm vào với 'ADD', có. – zerkms

4

Hoặc bạn có thể sử dụng bảng tạm thời:

CREATE TEMPORARY TABLE t AS 
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
); 

    DELETE FROM catalogue WHERE catalogue_id IN (SELECT catalogue_id FROM t); 

Với truy vấn của bạn, bạn có You can't specify target table 'catalogue' for update in FROM clause vì bạn không thể thực hiện lựa chọn và cập nhật trên cùng một bảng trong một truy vấn.

+0

Cảm ơn Kamil đã giải thích. –

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