PostgreSQL आंतरिक जुड़ाव के साथ हटाएं


198
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 JOINDELETE विवरण के लिए कोई उपलब्ध नहीं है: postgresql.org/docs/8.2/static/sql-delete.html
a_horse_with_no_name

किसी भी वैकल्पिक विधि को आंतरिक जुड़ाव के बिना इस क्वेरी को निष्पादित करने के लिए
ड्यूड

मैनुअल देखें, वास्तव में इसके लिए एक उदाहरण है।
a_horse_with_no_name 6

जवाबों:


297
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
बड़ी तालिकाओं के लिए, इस उत्तर में पहला समाधान संभावित रूप से बहुत तेज है।
16

2
सबसे अच्छा जवाब, विशेष रूप से पहला एक, क्योंकि यह आपको कई क्षेत्रों द्वारा मैच करने की अनुमति देता है।
कोस्तनोस

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

31

एक और रूप जो पोस्टग्रैजेस 9.1+ के साथ काम करता है, कॉमन टेबल एक्सप्रेशन को ज्वाइन करने के लिए 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

यदि आपके पास एक से अधिक शामिल हैं, तो आप कॉमा से अलग किए गए स्टेटमेंट का उपयोग कर सकते हैं:

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 के साथ एक सबक्वेरी का उपयोग करें:

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

क्वेरी को अनुकूलित करने के लिए,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.