내부 조인으로 PostgreSQL 삭제


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'

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

답변:


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

또는

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을위한 것이다
친구

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

31

Postgres 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

하나 이상의 조인이있는 경우 쉼표로 구분 된 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와 함께 하위 쿼리를 사용하십시오.

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

검색어를 최적화하기 위해

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.