이 쿼리를 기억할 수없는 것 같습니다!
ID가 Table2와 동일한 table1의 모든 행을 삭제하고 싶습니다.
그래서:
DELETE table1 t1
WHERE t1.ID = t2.ID
나는 WHERE ID IN (SELECT ID FROM table2)을 할 수 있다는 것을 알고 있지만 가능한 경우 JOIN을 사용 하여이 쿼리를 수행하고 싶습니다.
이 쿼리를 기억할 수없는 것 같습니다!
ID가 Table2와 동일한 table1의 모든 행을 삭제하고 싶습니다.
그래서:
DELETE table1 t1
WHERE t1.ID = t2.ID
나는 WHERE ID IN (SELECT ID FROM table2)을 할 수 있다는 것을 알고 있지만 가능한 경우 JOIN을 사용 하여이 쿼리를 수행하고 싶습니다.
답변:
DELETE t1
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID;
우발적 인 것을 방지하기 때문에 항상 delete 문에서 별칭을 사용합니다.
DELETE Table1
전체 쿼리를 실행하기 전에 강조 표시하지 못할 때 발생합니다.
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)
이 링크가 유용함
거기에서 복사
종종 다른 테이블의 기준에 따라 테이블에서 일부 레코드를 삭제하려고합니다. 두 테이블의 레코드를 제거하지 않고 해당 테이블 중 하나에서 어떻게 삭제합니까?
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인지 확인할 수도 있습니다. 그러면 관계를 추가하기위한 준비와 같이 일치하지 않는 하나의 테이블에서 레코드를 제거 할 수 있습니다. ) 올 예제 게시물.
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 엔진에서 오류를 발생시켜야합니다.
MSDN T-SQL DELETE 참조 (예 D) :
DELETE FROM Table1
FROM Tabel1 t1
INNER JOIN Table2 t2 on t1.ID = t2.ID
나는 종종 다음과 같은 구성 예제와 같은 일을합니다. (이 예제는 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');
저는이 방법을 좋아합니다. 적어도 저에게는 필터링 기준이 쿼리를 생성하는 동안 더 쉽게 읽을 수 있고, 지금부터 몇 달 후 내가보고 무엇을 생각하고 있는지 궁금해 할 때 이해하기 쉽기 때문입니다.