다른 테이블에서 참조되지 않은 DELETE 행


15

PostgreSQL 9.3 데이터베이스에는 두 개의 테이블이 있습니다. Table link_replywhich_grouptable을 가리키는 외래 키를 가지고 link_group있습니다.

link_group관련 행이 link_reply존재 하지 않는 모든 행을 삭제하고 싶습니다 . 충분히 기본적으로 들리지만 어려움을 겪고 있습니다.

이처럼 간단하지 않습니까 (작동하지 않음)?

DELETE FROM link_group WHERE link_reply = NULL;

모든 사람이 볼 수있는 DDL이 있습니까?
dizzystar

MINUS 연산자를 살펴보십시오. links_reply에 필드를 지정해야합니다.
Vérace

DELETE FROM links_group USING links_group AS lg LEFT JOIN links_reply AS lr ON lg.col= lr.some_other_col WHERE links_reply.some_other_col IS NULL
Mihai

나는 비슷한 질문을했고, 그것은 또한 동시성을 고려합니다. dba.stackexchange.com/questions/251875를 참조하십시오 .
pbillen

답변:


19

매뉴얼 인용 :

데이터베이스의 다른 테이블에 포함 된 정보를 사용하여 테이블에서 행을 삭제하는 방법에는 두 가지가 있습니다. 하위 선택 사용 또는 USING절에 추가 테이블 지정 . 어떤 기술이 더 적합한 지 특정 상황에 따라 다릅니다.

대담한 강조 광산. 다른 테이블에 포함 되지 않은 정보를 사용하는 것은 약간 까다 롭지 만 쉬운 해결책이 있습니다. 표준 기술의 무기고에서 ...

... NOT EXISTS반-세미-조인은 아마도 가장 간단하고 가장 효율적일 것입니다 DELETE.

DELETE FROM link_group lg
WHERE  NOT EXISTS (
   SELECT FROM link_reply lr
   WHERE  lr.which_group = lg.link_group_id
   );

link_group_id기본 키의 열 이름으로 (테이블 정의가 제공되지 않았으므로) 가정합니다 link_group.

@Mihai가 언급 한 기술 도 잘 작동합니다 (올바르게 적용됨).

DELETE FROM link_group lg
USING  link_group      lg1
LEFT   JOIN link_reply lr ON lr.which_group = lg1.link_group_id
WHERE  lg1.link_group_id = lg.link_group_id
AND    lr.which_group IS NULL;

그러나 USING절의 테이블 표현식 이을 사용하여 대상 테이블 ( lg예제)에 조인되므로 CROSS JOIN,에 대한 디딤돌 ( lg1예제) 과 동일한 테이블의 다른 인스턴스가 필요합니다 LEFT JOIN.

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