PostgreSQL ลบด้วยการเข้าร่วมภายใน


200
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'

ฉันได้รับข้อผิดพลาด 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 ...

ฉันพยายามให้

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

ฉันพยายามให้

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

ปัญหาในการสืบค้นของฉันคืออะไร


3
8.2? คุณควรอัพเกรดโดยเร็วที่สุด รุ่นนั้นไม่ได้รับการสนับสนุนอีกต่อไป และโปรดอ่านคู่มือ: ไม่มีINNER JOINคำสั่ง DELETE: postgresql.org/docs/8.2/static/sql-delete.html
a_horse_with_no_name

วิธีอื่นใดสำหรับการดำเนินการค้นหานี้โดยไม่ต้องเข้าร่วมภายใน
เพื่อน

ดูคู่มือมีตัวอย่างที่แน่นอน
a_horse_with_no_name

คำตอบ:


301
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';

หรือ

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 สำหรับ mysql .. ข้อสงสัยของฉันคือ sql และ postgre sql
dude

14
สำหรับตารางที่ใหญ่กว่าทางออกแรกในคำตอบนี้อาจเร็วกว่ามาก
mgoldwasser

2
คำตอบที่ดีที่สุดโดยเฉพาะคำตอบแรกที่ให้คุณจับคู่ได้จากหลาย ๆ ฟิลด์
Kostanos

57

สิ่งนี้ใช้ได้กับฉัน:

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'); 

32

อีกรูปแบบหนึ่งที่ทำงานร่วมกับ Postgres 9.1+ กำลังรวม Common Table Expression เข้ากับคำสั่ง USING สำหรับการเข้าร่วม

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

หากคุณมีมากกว่าหนึ่งเข้าร่วมคุณสามารถใช้คำสั่ง USING ที่คั่นด้วยเครื่องหมายจุลภาค:

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'

การอ้างอิง


22

เพียงใช้แบบสอบถามย่อยด้วย INNER JOIN, LEFT JOIN หรือ smth else:

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'
)

เพื่อเพิ่มประสิทธิภาพการค้นหา

  • ใช้NOT EXISTSแทนIN
  • และด้วยสำหรับคิวรีย่อยขนาดใหญ่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.