2012-08-01 15 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' 

que estoy recibiendo el siguiente error de PostgreSQL 8.2.11PostgreSQL eliminar con combinación interna

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

He intentado dar

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

i intentado dejar

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

lo que es el problema con mi consulta?

+2

8.2? Debe actualizar lo antes posible. Esa versión ya no es compatible. Y, por favor, lea el manual: no hay 'INNER JOIN' disponible para la declaración DELETE: http://www.postgresql.org/docs/8.2/static/sql-delete.html –

+0

ningún método alternativo para ejecutar esta consulta sin interna join – dude

+0

Consulte el manual, hay un ejemplo para eso exactamente. –

Respuesta

37

Esto funcionó para mí:

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

Esto funcionó para mí también. ¡Aclamaciones! – 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'; 

o

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

me sale el mismo error !!! – dude

+0

@ 0mesh es para mysql .. mi duda es para sql y postgre sql – dude

+0

actualizado mi publicación espero que haya recibido su respuesta. – Omesh

16

Otra forma que trabaja con Postgres 9.1+ es la combinación de una expresión de tabla común con la instrucción USING para la combinación.

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

sólo tiene que utilizar una subconsulta con INNER JOIN, LEFT JOIN o Smth otra cosa:

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

para optimizar la consulta,

Cuestiones relacionadas