PostgreSQL xóa với tham gia bên trong


197
DELETE B.* 
FROM   m_productprice B  
       INNER JOIN m_product C ON B.m_product_id = C.m_product_id 
WHERE  C.upc = '7094' AND B.m_pricelist_version_id = '1000020'

Tôi nhận được lỗi sau PostgreSQL 8.2.11

ERROR:  syntax error at or near "B"
LINE 1: DELETE B.* from m_productprice B  INNER JOIN m_product C ON ...

tôi đã cố gắng cho

DELETE B from m_productprice B  INNER JOIN m_product C ON B....
 ERROR:  syntax error at or near "B"

tôi đã cố gắng cho

ERROR:  syntax error at or near "INNER"
LINE 1: DELETE from m_productprice B  INNER JOIN m_product C ON B.m_...

vấn đề với truy vấn của tôi là gì?


3
8.2? Bạn nên nâng cấp càng sớm càng tốt. Phiên bản đó không còn được hỗ trợ. Và vui lòng đọc hướng dẫn: không INNER JOINcó sẵn cho câu lệnh DELETE: postgresql.org/docs/8.2/static/sql-delete.html
a_horse_with_no_name

bất kỳ phương pháp thay thế nào để thực hiện truy vấn này mà không cần tham gia bên trong
anh chàng

Xem hướng dẫn, có một ví dụ cho chính xác đó.
a_horse_with_no_name

Câu trả lời:


296
DELETE 
FROM m_productprice B  
     USING m_product C 
WHERE B.m_product_id = C.m_product_id AND
      C.upc = '7094' AND                 
      B.m_pricelist_version_id='1000020';

hoặc là

DELETE 
FROM m_productprice
WHERE m_pricelist_version_id='1000020' AND 
      m_product_id IN (SELECT m_product_id 
                       FROM m_product 
                       WHERE upc = '7094'); 

@ 0mesh nó cho mysql .. nghi ngờ của tôi là dành cho sql và postgre sql
dude

14
đối với các bảng lớn hơn, giải pháp đầu tiên trong câu trả lời này có khả năng nhanh hơn nhiều.
mgoldwasser

2
Câu trả lời tốt nhất, đặc biệt là câu đầu tiên, vì nó cho phép bạn khớp theo nhiều trường.
Kostanos

57

Điều này làm việc cho tôi:

DELETE from m_productprice
WHERE  m_pricelist_version_id='1000020'
       AND m_product_id IN (SELECT m_product_id
                            FROM   m_product
                            WHERE  upc = '7094'); 

31

Một hình thức khác hoạt động với Postgres 9.1+ là kết hợp Biểu thức bảng chung với câu lệnh SỬ DỤNG cho phép nối.

WITH prod AS (select m_product_id, upc from m_product where upc='7094')
DELETE FROM m_productprice B
USING prod C
WHERE B.m_product_id = C.m_product_id 
AND B.m_pricelist_version_id = '1000020';

26

Nếu bạn có nhiều hơn một lần tham gia, bạn có thể sử dụng các câu lệnh SỬ DỤNG được phân tách bằng dấu phẩy:

DELETE 
FROM 
      AAA AS a 
USING 
      BBB AS b,
      CCC AS c
WHERE 
      a.id = b.id 
  AND a.id = c.id
  AND a.uid = 12345 
  AND c.gid = 's434sd4'

Tài liệu tham khảo


22

Chỉ cần sử dụng truy vấn con với INNER THAM GIA, TRÁI THAM GIA hoặc smth khác:

DELETE FROM m_productprice
WHERE m_product_id IN
(
  SELECT B.m_product_id
  FROM   m_productprice  B
    INNER JOIN m_product C 
    ON   B.m_product_id = C.m_product_id
  WHERE  C.upc = '7094' 
  AND    B.m_pricelist_version_id = '1000020'
)

để tối ưu hóa truy vấ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.