2012-10-01 45 views
25

Tôi không làm quen với Oracle Sql Queries, do đó tôi gặp phải một số vấn đề khi xóa một số hàng khỏi bảng. Nói cách khác, tôi muốn viết một truy vấn để xóa các hàng bao gồm JOIN.Xóa bằng "Tham gia" trong Oracle sql Truy vấn

Trong trường hợp của tôi, tôi có một bảng ProductFilters và một bảng khác Products đã tham gia trên các trường ProductFilters.productID = Products.ID. Tôi muốn xóa các hàng từ ProductFilters có mức cao hơn hoặc bằngvà sản phẩm mà chúng tham chiếu có tên 'Đánh dấu' (tên là trường trong Sản phẩm).

Tôi muốn được thông báo ban đầu nếu JOIN được chấp nhận trong Truy vấn xóa trong Oracle. Nếu không làm thế nào tôi nên sửa đổi truy vấn này để làm cho nó làm việc, kể từ khi vào mẫu mà tôi nhận được một lỗi:

DELETE From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
(
    Select rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
);  
+0

lỗi bạn đang gặp phải là gì? – davek

+0

có, bạn có thể xóa bằng cách sử dụng một tham gia: xem tại đây http://stackoverflow.com/a/3675205/110933 – davek

Trả lời

21

Dựa trên câu trả lời tôi liên kết với trong bình luận của tôi ở trên, điều này sẽ làm việc:

delete from 
(
select pf.* From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
    (
    Select rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
) 
); 

hoặc

delete from PRODUCTFILTERS where rowid in 
(
select pf.rowid From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
    (
    Select PRODUCTFILTERS.rowid from PRODUCTFILTERS 
    inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
    And PRODUCTS.NAME= 'Mark' 
) 
); 
+0

Tôi đã thử thứ hai và tôi nhận được lỗi: "Cột mơ hồ được xác định". Bên cạnh đó tôi nghĩ rằng cú pháp chính xác lúc bắt đầu là xóa PRODUCTFILTERS ở đâu ... A "From" là thừa trong một truy vấn xóa. – arjacsoh

+0

ok, tôi đã thêm một bộ định tính vào tham chiếu rowid lồng nhau. – davek

+1

Ok, lần này nó hoạt động – arjacsoh

48

Gần đây tôi đã học được cú pháp sau:

DELETE (SELECT * 
     FROM productfilters pf 
     INNER JOIN product pr 
      ON pf.productid = pr.id 
     WHERE pf.id >= 200 
      AND pr.NAME = 'MARK') 

Tôi nghĩ rằng nó trông sạch hơn nhiều sau đó mã đề xuất khác.

+0

Rất sạch sẽ thực sự. Sử dụng điều này trong tương lai để những người khác có thời gian dễ dàng hơn hiểu chính xác những gì đang bị xóa. – user2025696

+0

Cái này ** nhanh hơn nhiều so với các lựa chọn thay thế chủ yếu đi qua một điều kiện ở đâu chứ không phải là kết nối. –

+0

Chỉ muốn thêm rằng, nếu JOIN là với một bộ sưu tập (bảng của một cái gì đó), một lỗi tăng lên vì không có DML có thể chạy trên một bộ sưu tập PL/SQL. Tuy nhiên, cú pháp đẹp. – Alfabravo

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