2012-08-01 3 views
97
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.11PostgreSQL удалить с внутренним соединением

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_... 

что проблема с моим запросом?

+2

8.2? Вы должны обновить как можно скорее. Эта версия больше не поддерживается. И, пожалуйста, прочтите руководство: для оператора DELETE нет 'INNER JOIN': http://www.postgresql.org/docs/8.2/static/sql-delete.html –

+0

любой альтернативный метод для выполнения этого запроса без внутреннего join – dude

+0

См. руководство, для примера есть пример. –

ответ

37

Это работает для меня:

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

Это сработало и для меня. Ура! – Melvin

158
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'); 
+0

Я получаю ту же ошибку !!! – dude

+0

@ 0mesh его для mysql .. мое сомнение для sql и postgre sql – dude

+0

обновлено мое сообщение надеюсь, что вы получили свой ответ. – Omesh

16

Другая форма, которая работает с Postgres 9.1+ сочетает Общую таблицу Expression с ПРИМЕНЕНИЕМ заявление для объединения.

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

Просто используйте подзапрос с INNER JOIN, LEFT JOIN или чего-л еще:

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
  • и WITH для большие подзапросы
Смежные вопросы