SQL 서버에서 INSER JOIN을 사용하여 여러 테이블에서 삭제하려면 어떻게 해야 합니까?
MySQL에서는 다음 구문을 사용할 수 있습니다.
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
SQL Server에서 동일한 작업을 수행하려면 어떻게 해야 합니까?
이 예에서는 "삭제된" 의사 테이블을 이용할 수 있습니다.예를 들어 다음과 같습니다.
begin transaction;
declare @deletedIds table ( id int );
delete from t1
output deleted.id into @deletedIds
from table1 as t1
inner join table2 as t2
on t2.id = t1.id
inner join table3 as t3
on t3.id = t2.id;
delete from t2
from table2 as t2
inner join @deletedIds as d
on d.id = t2.id;
delete from t3
from table3 as t3 ...
commit transaction;
세 번째 테이블에 참여할 것이 필요한 경우 두 번째 삭제 시 'output deleted'를 수행할 수 있습니다.
사이드 노트로서 삽입도 할 수 있습니다.* 가 삽입된 스테이트먼트에 둘 다 삽입되었습니다.* 및 삭제되었습니다.* 업데이트 스테이트먼트에 있습니다.
EDIT: 또한 table1에 트리거를 추가하여 table2 + 3에서 삭제하는 것을 고려해 본 적이 있습니까?암묵적인 트랜잭션의 내부가 되고 "삽입" 및 "삭제" 의사 테이블도 사용할 수 있습니다.
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;
테이블 관계에서 언제든지 계단식 삭제를 설정할 수 있습니다.
여러 삭제를 하나의 저장 프로시저로 캡슐화할 수 있습니다.
트랜잭션을 사용하여 하나의 작업 단위를 보장할 수 있습니다.
마스터 테이블에서 일부 레코드를 삭제하고 2개의 상세 테이블에서 대응하는 레코드를 삭제하는 예:
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
기본적으로 트랜잭션에서 자녀, 부모 순으로 3개의 삭제 스테이트먼트를 작성해야 합니다.이것이 일회성이 아니고 기존의 트리거 설정과 경합하지 않는 경우 단계적 삭제 설정을 권장합니다.
그냥 궁금해서...MySQL에서 그게 정말 가능한가요? t1과 t2가 삭제될까요? 아니면 질문을 잘못 이해한 것 뿐입니다.
그러나 여러 조인 조건이 있는 table1만 삭제하려면 삭제할 테이블에 별칭을 지정하지 마십시오.
이것은, 다음과 같습니다.
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
MSQL로 동작하려면 , 다음과 같이 기술할 필요가 있습니다.
DELETE table1
FROM table1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
다른 2개의 공통 RDBMS가 삭제 조작을 실행하는 방법을 비교합니다.
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
SQL 서버에서는 join을 사용하여 여러 테이블에서 레코드를 삭제할 수 없습니다.따라서 부모 양식을 삭제하기 전에 먼저 자식에서 삭제해야 합니다.
이것은 고아들을 남겨두지 않고 레코드를 삭제하는 다른 방법입니다.
@user 테이블 선언(keyValue int, someString varchar(10))@user에 삽입하다값(1, '1 value') @user에 삽입하다값(2, '2 value') @user에 삽입하다값(3, '3 value') @password Table ( keyValue int , details varchar ( 10 )를 선언합니다.@password에 삽입값(1, '1 패스워드')@password에 삽입값(2, '2 패스워드')@password에 삽입값(3, '3 비밀번호') --삭제 전@password에서 *를 선택하여 내부 조인 @user b를 수행합니다.on a.keyvalue = b.keyvalue*을(를) #timeout으로 선택@user로부터의 ID 여기서 keyvalue=1 -- 이것은 출력 예시와 같이 동작합니다.delete @user 여기서 key value = 1delete @password where key value in (#passwordid에서 key value 선택) --삭제 후--@password에서 *를 선택하여 내부 조인 @user b를 수행합니다.on a.keyvalue = b.keyvalue
모두 지적되었습니다. 둘 중 하나를 하세요.DELETE ON CASCADEtable 삭제해 주세요.child-table 다음에 또 한 번.parent.
Aaron이 이미 지적한 바와 같이 삭제 동작을 CASCADE로 설정하면 부모 레코드가 삭제되면 자녀 레코드가 삭제됩니다.다른 마법이 일어나기를 바라지 않는 한(Aaron의 응답 포인트 2, 3이 도움이 되는 경우) 내부 조인에서 삭제할 필요가 없습니다.
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;
DELETE TABLE1 LIN
FROM TABLE1 LIN
INNER JOIN TABLE2 LCS ON CONDITION
WHERE CONDITION
" FROM $sql="삭제처"basic_tbl ,education_tbl,personal_tbl ,address_tbl ,department_tbl을 사용.basic_tbl ,education_tbl,personal_tbl ,address_tbl ,department_tblWHERE whereb_id=e_id=p_id=a_id=d_id'.$sql$id.'; $rs=mysqli_secon,$sql;
언급URL : https://stackoverflow.com/questions/783726/how-do-i-delete-from-multiple-tables-using-inner-join-in-sql-server
'programing' 카테고리의 다른 글
| Bash에서 문자를 반복하려면 어떻게 해야 하나요? (0) | 2023.04.15 |
|---|---|
| 장고: openpyxl 워크북을 첨부 파일로 저장 (0) | 2023.04.15 |
| 같은 브랜치상의 2개의 다른 커밋 간에 같은 파일을 어떻게 구별합니까? (0) | 2023.04.15 |
| 추적되었지만 .gitignore에 있는 파일을 Git이 잊게 하려면 어떻게 해야 하나요? (0) | 2023.04.15 |
| SELECT 쿼리의 SQL Server LOCKS 이해 (0) | 2023.04.15 |