XÓA các hàng không được tham chiếu trong bảng khác


15

Tôi có hai bảng trong cơ sở dữ liệu PostgreQuery 9.3: Bảng link_replycó khóa ngoại có tên which_grouptrỏ vào bảng link_group.

Tôi muốn xóa tất cả các hàng từ link_groupnơi không có hàng liên quan link_replytồn tại. Nghe có vẻ cơ bản nhưng tôi đã phải vật lộn với nó.

Nó sẽ là một cái gì đó đơn giản như thế này (không hoạt động)?

DELETE FROM link_group WHERE link_reply = NULL;

Bạn có DDL cho mọi người nhìn không?
dizzystar

Hãy nhìn vào toán tử MINUS. Bạn phải chỉ định một trường trong links_Vply.
Vérace

DELETE FROM links_group USING links_group AS lg LEFT JOIN links_reply AS lr ON lg.col= lr.some_other_col WHERE links_reply.some_other_col IS NULL
Mihai

Tôi đã có một câu hỏi tương tự, cũng có tính đồng thời trong tài khoản. Xem dba.stackexchange.com/questions/251875 .
pbillen

Câu trả lời:


19

Trích dẫn hướng dẫn sử dụng:

Có hai cách để xóa các hàng trong một bảng bằng cách sử dụng thông tin có trong các bảng khác trong cơ sở dữ liệu: sử dụng các lựa chọn phụ hoặc chỉ định các bảng bổ sung trong USINGmệnh đề . Kỹ thuật nào phù hợp hơn phụ thuộc vào hoàn cảnh cụ thể.

Nhấn mạnh đậm của tôi. Sử dụng thông tin không có trong một bảng khác là một chút khó khăn, nhưng có những giải pháp dễ dàng. Từ kho vũ khí tiêu chuẩn đến ...

... việc NOT EXISTSchống bán tham gia có lẽ đơn giản và hiệu quả nhất đối với DELETE:

DELETE FROM link_group lg
WHERE  NOT EXISTS (
   SELECT FROM link_reply lr
   WHERE  lr.which_group = lg.link_group_id
   );

Giả sử (vì định nghĩa bảng không được cung cấp) link_group_idlàm tên cột cho khóa chính của link_group.

Kỹ thuật @Mihai nhận xét cũng hoạt động (áp dụng chính xác):

DELETE FROM link_group lg
USING  link_group      lg1
LEFT   JOIN link_reply lr ON lr.which_group = lg1.link_group_id
WHERE  lg1.link_group_id = lg.link_group_id
AND    lr.which_group IS NULL;

Nhưng vì biểu thức bảng trong USINGmệnh đề được nối với bảng đích ( lgtrong ví dụ) với a CROSS JOIN, bạn cần một thể hiện khác của cùng bảng với bước đệm ( lg1trong ví dụ) cho LEFT JOIN, ít thanh lịch hơn và thường chậm hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.