94

MySQL에서는 구문을 사용할 수 있습니다.

DELETE t1,t2 
FROM table1 AS t1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

SQL Server에서 동일한 작업을 수행하려면 어떻게해야합니까?

13 답변


100

이 예제에서 "삭제 된"의사 테이블을 활용할 수 있습니다. 같은 것 :

begin transaction;

   declare @deletedIds table ( id int );

   delete t1
   output deleted.id into @deletedIds
   from table1 t1
    join table2 t2
      on t2.id = t1.id
    join table3 t3
      on t3.id = t2.id;

   delete t2
   from table2 t2
    join @deletedIds d
      on d.id = t2.id;

   delete t3
   from table3 t3 ...

commit transaction;

분명히 당신은 '출력 삭제'를 할 수 있습니다. 두 번째 삭제에서도 세 번째 테이블에 가입 할 항목이 필요한 경우

부가 설명으로 insert 문에. *를 삽입하고 update 문에. * 및 deleted. *를 삽입 할 수도 있습니다.

편집하다:또한 table2 + 3에서 삭제할 table1에 트리거를 추가하는 방법을 고려 했습니까? 당신은 암시적인 트랜잭션 내부에있을 것이고, 또한 "삽입되어있을 것입니다."및"삭제되었습니다."의사 표를 사용할 수 있습니다.


  • id1 = x 인 table1에서 DELETE를 수행 한 다음 내부 조인을 사용하는 대신 다음 테이블에서 삭제하는 것이 좋습니까? 기본적으로, 내부 조인을 건너 뛰는 것은 단지 2 개의 간단한 쿼리가 필요합니다 .... 아니면이 방법이 더 효율적입니까? - Colandus
  • 나는 where 절이 얼마나 복잡한 지에 달려 있다고 생각한다. 복잡한 경우에는 한 번만 발생하기 때문에 더 좋을 것입니다. 그러나 많은 행에 영향을 미치는 더 단순한 where 절에 대해서는 테이블 변수에 많은 ID를 보유해야하기 때문에 제안서가 더 효율적일 수 있습니다. - John Gibb
  • @ 존 깁 (JohnGibb),이 답변은 어떻게 작동합니까? MySQL 개발자가이 대답을 이해할 수 있도록 설명해 주시겠습니까? - Pacerier
  • @Pacerier MySQL에 익숙하지 않습니다. 첫 번째 삭제는 table1에서만 삭제되지만 삭제 된 ID는 변수에 저장된다는 아이디어가 있습니다. 후속 두 명령.은 해당 변수를 사용하여 table2와 table3에서 연관된 행을 h 제하는 f}을 설명합니다. - John Gibb
  • @JohnGibb, 지금그게명확한. 그 내용을 답안에 포함시켜야합니다. - Pacerier

14

  1. 테이블의 관계에 대해 계단식 삭제를 설정할 수 있습니다.

  2. 하나의 저장 프로 시저에 여러 삭제를 캡슐화 할 수 있습니다.

  3. 하나의 작업 단위를 보장하기 위해 트랜잭션을 사용할 수 있습니다.


  • 분명히 join 문에서 삭제할 수 있습니다. 한 번에 둘 이상의 테이블에서 삭제하려고합니다. - Byron Whitlock
  • 잘못된 대답, 조인을 삭제와 함께 사용할 수 있습니다. - rboarman
  • 이제 응답이 정확합니다. - Robino
  • 1. 사실이 아니기 때문에 항상 가능하지는 않습니다. 계단식 삭제를 설정할 수없는 몇 가지 시나리오가 있습니다 (예 : 사이클 또는 다중 계단식 경로. (만나다stackoverflow.com/a/3548225/108374예를 들면) - Tom Pažourek

14

SQL Server의 DELETE에서 FROM 절에 JOIN 구문을 사용할 수 있지만 여전히 첫 번째 테이블에서만 삭제되며 하위 쿼리 대신 사용할 수있는 독점 Transact-SQL 확장입니다.

예제에서이리:

 -- Transact-SQL extension
 DELETE 
   FROM Sales.SalesPersonQuotaHistory 
     FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN 
          Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID
    WHERE sp.SalesYTD > 2500000.00;


  • 예 D : Sales.SalesPersonQuotaHistory에서 삭제 Sales.SalesPersonQuotaHistory AS spqh INNER JOIN Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID WHERE sp.SalesYTD & gt; 2500000.00; - Mark A

11

마스터 테이블에서 일부 레코드를 삭제하고 두 개의 세부 테이블에서 해당 레코드를 삭제하는 예 :

BEGIN TRAN

  -- create temporary table for deleted IDs
  CREATE TABLE #DeleteIds (
    Id INT NOT NULL PRIMARY KEY
  )

  -- save IDs of master table records (you want to delete) to temporary table    
  INSERT INTO #DeleteIds(Id)
  SELECT DISTINCT mt.MasterTableId
  FROM MasterTable mt 
  INNER JOIN ... 
  WHERE ...  

  -- delete from first detail table using join syntax
  DELETE d
  FROM DetailTable_1 D
  INNER JOIN #DeleteIds X
    ON D.MasterTableId = X.Id


  -- delete from second detail table using IN clause  
  DELETE FROM DetailTable_2
  WHERE MasterTableId IN (
    SELECT X.Id
    FROM #DeleteIds X
  )


  -- and finally delete from master table
  DELETE d
  FROM MasterTable D
  INNER JOIN #DeleteIds X
    ON D.MasterTableId = X.Id

  -- do not forget to drop the temp table
  DROP TABLE #DeleteIds

COMMIT


  • 사용할 수 있습니까?SELECT INTO #DeleteIds대신에CREATE TABLE 'DeleteIds뒤이어INSERT INTO 'DeleteIds...? - Caltor

9

그냥 궁금해 .. 정말 MySQL에서 가능합니까? 그것은 t1과 t2를 삭제할 것인가? 또는 나는 그 질문을 오해했다.

그러나 여러 조인 조건이있는 table1을 삭제하려는 경우 삭제하려는 테이블의 별칭을 지정하지 마십시오.

이:

DELETE t1,t2 
FROM table1 AS t1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

MSSQL에서 작동하려면 다음과 같이 작성해야합니다.

DELETE table1
FROM table1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

다른 두 개의 공통 RDBMS가 삭제 작업을 수행하는 방법을 대조하십시오.

http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html


  • SQL Server 팁을 가져 주셔서 감사합니다.이 라인을 따라 SQL을 조정해야했습니다. - Pauk

7

기본적으로, 당신은 하나의 트랜잭션에서 세 개의 delete 문을 만들어야합니다. 계단식 삭제 설정은 일회적 인 것이 아니며 기존의 트리거 설정과 충돌하지 않는 한 좋은 생각입니다.


  • 부모님의 자녀가 아니기 때문에 임시 테이블에 ID를 선택해야한다고 생각합니다. 한 테이블의 행이 사라지면 다른 행을 가져올 방법이 없습니다. - Byron Whitlock

3

SQL 서버에서는 join을 사용하여 여러 테이블을 삭제할 수 없습니다. 따라서 폼 부모를 삭제하기 전에 먼저 아이로부터 삭제해야합니다.


2

이것은 고아를 떠나지 않고 레코드를 삭제할 수있는 또 다른 방법입니다.


Declare @user Table(keyValue int  , someString varchar(10))
insert into @user
values(1,'1 value')

insert into @user
values(2,'2 value')

insert into @user
values(3,'3 value')

Declare @password Table(  keyValue int , details varchar(10))
insert into @password
values(1,'1 Password')
insert into @password
values(2,'2 Password')
insert into @password
values(3,'3 Password')

        --before deletion
  select * from @password a inner join @user b
                on a.keyvalue = b.keyvalue
  select * into #deletedID from @user where keyvalue=1 -- this works like the output example
  delete  @user where keyvalue =1
  delete @password where keyvalue in (select keyvalue from #deletedid)

  --After deletion--
  select * from @password a inner join @user b
                on a.keyvalue = b.keyvalue


2

모든 것이 지적되었습니다. 그냥 둘 중 하나를 사용하십시오.DELETE ON CASCADE부모에table또는에서 삭제child-table~로parent.


1

Aaron이 이미 지적했듯이 CASCADE에 삭제 동작을 설정하면 부모 레코드가 삭제 될 때 하위 레코드가 삭제됩니다. 다른 종류의 마법이 필요하지 않다면 (Aaron의 대답 중 2, 3이 유용 할 것입니다.) 왜 내부 조인을 사용하여 삭제해야하는지 알 수 없습니다.


0

John Gibb의 답을 바탕으로 FK 관계가있는 두 테이블의 데이터 세트를 삭제하려면 다음을 수행하십시오.

--*** To delete from tblMain which JOINs to (has a FK of) tblReferredTo's PK  
--       i.e.  ON tblMain.Refer_FK = tblReferredTo.ID
--*** !!! If you're CERTAIN that no other rows anywhere also refer to the 
--      specific rows in tblReferredTo !!!
BEGIN TRAN;

    --*** Keep the ID's from tblReferredTo when we DELETE from tblMain
    DECLARE @tblDeletedRefs TABLE ( ID INT );
    --*** DELETE from the referring table first
    DELETE FROM tblMain 
    OUTPUT DELETED.Refer_FK INTO @tblDeletedRefs  -- doesn't matter that this isn't DISTINCT, the following DELETE still works.
    WHERE ..... -- be careful if filtering, what if other rows 
                --   in tblMain (or elsewhere) also point to the tblReferredTo rows?

    --*** Now we can remove the referred to rows, even though tblMain no longer refers to them.
    DELETE tblReferredTo
    FROM   tblReferredTo INNER JOIN @tblDeletedRefs Removed  
            ON tblReferredTo.ID = Removed.ID;

COMMIT TRAN;


-3

DELETE     TABLE1 LIN
FROM TABLE1 LIN
INNER JOIN TABLE2 LCS ON  CONDITION
WHERE CONDITION


  • Nooooo ... 일하지 않을거야. - LittleBobbyTables
  • 두 개 이상의 테이블에서 삭제되지 않습니다. 질문을 이해해주세요. - Kamran Shahid

-4

$ sql = "DELETE FROMbasic_tbl,education_tbl,personal_tbl,address_tbl,department_tbl사용 중basic_tbl,education_tbl,personal_tbl,address_tbl,department_tbl어디에b_id=e_id=p_id=a_id=d_id= ' ". $ id."' ";  $ rs = mysqli_query ($ con, $ sql);


  • 형식을 수정하고 코드가 작동하는 이유에 대한 간단한 설명을 제공하십시오. - Tanis.7x
  • SQLServer가 MySQL이 아닙니다. 그것은 mysql에서와 같이 작동합니다. - Byron Whitlock

연결된 질문


관련된 질문

최근 질문