다른 테이블을 기반으로 테이블의 모든 행 삭제


81

이 쿼리를 기억할 수없는 것 같습니다!

ID가 Table2와 동일한 table1의 모든 행을 삭제하고 싶습니다.

그래서:

DELETE table1 t1
 WHERE t1.ID = t2.ID

나는 WHERE ID IN (SELECT ID FROM table2)을 할 수 있다는 것을 알고 있지만 가능한 경우 JOIN을 사용 하여이 쿼리를 수행하고 싶습니다.


가입하려는 이유는 무엇입니까?
tster 2010 년

무엇 당신이 질문을 할 계획입니까 : stackoverflow.com/questions/1590709/...
OMG 조랑말

조인은 종종 더 빠르기 때문입니다.
HLGEM

@tster 아마도 그것은 필요가 삭제되는 것을 식별자의 임시 테이블이다
스티븐 메사

1
@HLGEM 쿼리 옵티마이 저가 조인만큼 빨리 "XY IN 위치에서 X에서 삭제 (Bar에서 Foo 선택)"를 수행 할만큼 똑똑하지 않다는 말입니까? 나는 직감보다 옵티 마이저를 신뢰합니다.
tster 2010 년

답변:



88
DELETE t1 
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID;

우발적 인 것을 방지하기 때문에 항상 delete 문에서 별칭을 사용합니다.

DELETE Table1 

전체 쿼리를 실행하기 전에 강조 표시하지 못할 때 발생합니다.


5
주로 "항상 별칭 사용"주석에 대해 찬성합니다. 좋은 생각입니다.
rosscova 19 년

35

ANSI SQL에는 삭제, AFAIK에서 조인을 사용하는 솔루션이 없습니다.

DELETE FROM Table1
WHERE Table1.id IN (SELECT Table2.id FROM Table2)

나중에 편집

다른 솔루션 (때로는 더 빠르게 수행됨) :

DELETE FROM Table1
WHERE EXISTS( SELECT 1 FROM Table2 Where Table1.id = Table2.id)

그의 질문은 끝에 IN 절이 아닌 조인을 사용하고 싶다고 말합니다.
Stephen Mesa

21

PostgreSQL 구현은 다음과 같습니다.

DELETE FROM t1
USING t2
WHERE t1.id = t2.id;

4

이 시도:

DELETE Table1
FROM Table1 t1, Table2 t2
WHERE t1.ID = t2.ID;

또는

DELETE Table1
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;

3

이것을 해보면 조금 더 성능을 얻을 수 있다고 생각합니다

DELETE FROM Table1
WHERE EXISTS (
  SELECT 1
  FROM Table2
  WHERE Table1.ID = Table2.ID
)

3

그러면 Table1기준과 일치하는 모든 행이 삭제됩니다 .

DELETE Table1 
FROM Table2 
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = 'SomeStuff'

2

링크가 유용함

거기에서 복사

종종 다른 테이블의 기준에 따라 테이블에서 일부 레코드를 삭제하려고합니다. 두 테이블의 레코드를 제거하지 않고 해당 테이블 중 하나에서 어떻게 삭제합니까?

DELETE DeletingFromTable
     FROM DeletingFromTable INNER JOIN CriteriaTable
     ON DeletingFromTable.field_id = CriteriaTable.id
     WHERE CriteriaTable.criteria = "value";

핵심은 SELECT로 삭제할 테이블의 이름지정하는 것입니다 . 따라서 JOIN 및 WHERE는 선택 및 제한을 수행하고 DELETE는 삭제를 수행합니다. 하지만 하나의 테이블에만 국한되지 않습니다. 다 대다 관계 (예 : 구독으로 조인 된 잡지 및 구독자)가 있고 구독자를 제거하는 경우 조인 모델에서도 잠재적 인 레코드를 제거해야합니다.

 DELETE subscribers, subscriptions
     FROM subscribers INNER JOIN subscriptions 
       ON subscribers.id = subscriptions.subscriber_id
     INNER JOIN magazines 
       ON subscriptions.magazine_id = magazines.id
     WHERE subscribers.name='Wes';

LEFT JOIN 및 WHERE를 사용하여 조인 된 레코드를 삭제하여 조인 된 테이블이 NULL인지 확인할 수도 있습니다. 그러면 관계를 추가하기위한 준비와 같이 일치하지 않는 하나의 테이블에서 레코드를 제거 할 수 있습니다. ) 올 예제 게시물.


2

OP는 특정 DB를 요구하지 않으므로 표준 준수 진술을 사용하는 것이 좋습니다. MERGE대상 테이블에서 무언가를 결합하는 동안 행을 삭제 (또는 업데이트)하기위한 SQL 표준 에만 있습니다.

merge table1 t1
    using (
        select t2.ID
            from table2 t2
    ) as d
    on t1.ID = d.ID
    when matched then delete;

MERGE더 엄격한 의미를 가지고있어 DELETE ... FROM. 일치의 '고유성'을 적용합니다. 소스 (내부 문 using) 의 많은 행 이 대상의 동일한 행과 일치하면 병합을 취소하고 SQL 엔진에서 오류를 발생시켜야합니다.


이 구조를 삭제가 조인보다 더 깨끗
asakura89


0

다른 테이블을 기반으로 테이블 레코드를 삭제하려면

     Delete From Table1 a,Table2 b where a.id=b.id

    Or

      DELETE FROM Table1
    WHERE Table1.id IN (SELECT Table2.id FROM Table2)

  Or

        DELETE Table1
     FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;

0

이것은 내가 아는 오래되었지만 이것을 참조로 사용하는 사람에 대한 포인터입니다. 방금 이것을 시도했으며 Oracle을 사용하는 경우 JOIN이 DELETE 문에서 작동하지 않습니다. 다음 메시지가 표시됩니다.

ORA-00933 : SQL 명령이 제대로 종료되지 않았습니다.


Oracle에서 조인을 사용하여 삭제를 작성하는 방법에 대한 예제는 다른 질문에 대한 이 답변을 참조하십시오 .
Frédéric

0

OP는 'in'문을 사용하고 싶지 않지만 Ankur Gupta에 대한 답장으로 이것은 일대 다 관계에서 다른 테이블에 존재하지 않는 한 테이블의 레코드를 삭제하는 가장 쉬운 방법이었습니다. :

DELETE
FROM Table1 as t1
WHERE ID_Number NOT IN
(SELECT ID_Number FROM Table2 as t2)

나를 위해 Access 2016에서 매력처럼 일했습니다.


0

나는 종종 다음과 같은 구성 예제와 같은 일을합니다. (이 예제는 Linux에서 실행되는 Informix SE에서 가져온 것입니다.)

이 예의 요점은 real_estate 테이블의 정보를 기반으로 경감 애플리케이션에 버그가 있기 때문에 모든 부동산 면제 / 감소 거래 기록을 삭제하는 것입니다.

이 경우 last_update != null계정이 폐쇄되지 않았으며 res_exempt != 'p'계정이 개인 자산 (상업용 장비 / 가구)이 아님을 의미합니다.

delete from trans 
where   yr = '16'
and     tran_date = '01/22/2016'
and     acct_type = 'r'
and     tran_type = 'a'
and     bill_no in
(select acct_no from real_estate where last_update is not null
 and res_exempt != 'p');

저는이 방법을 좋아합니다. 적어도 저에게는 필터링 기준이 쿼리를 생성하는 동안 더 쉽게 읽을 수 있고, 지금부터 몇 달 후 내가보고 무엇을 생각하고 있는지 궁금해 할 때 이해하기 쉽기 때문입니다.


0
delete
    table1
from 
    t2
where
    table1.ID=t2.ID

mssql에서 작동

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