SQL Server에서 INSER JOIN을 사용하여 삭제하려면 어떻게 해야 합니까?
다음을 사용하여 삭제하고 싶다INNER JOIN
SQL Server 2008에 있습니다.
하지만 다음 오류가 발생합니다.
15,1, 15156, 15, 1, 15
키워드 'INNER' 근처의 구문이 잘못되었습니다.
내 코드:
DELETE
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06'
삭제할 테이블을 지정해야 합니다.다음은 에일리어스를 가진 버전입니다.
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
테이블 에는 표의 .DELETE
★★★★★★★★★★★★★★★★★」FROM
삭제할 테이블을 지정해야 하기 때문에 레코드를 삭제할 위치에서 선택합니다., 「」를 .ORDER BY
레코드합니다.
마지막 질문은 다음과 같습니다.
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
이것이 당신에게 도움이 될 수 있습니다.
DELETE FROM dbo.WorkRecord2
WHERE EmployeeRun IN (
SELECT e.EmployeeNo
FROM dbo.Employee e
WHERE ...
)
아니면 이걸 써보세요.
DELETE FROM dbo.WorkRecord2
WHERE EXISTS(
SELECT 1
FROM dbo.Employee e
WHERE EmployeeRun = e.EmployeeNo
AND ....
)
이것을 시험해 보세요.
DELETE FROM WorkRecord2
FROM Employee
Where EmployeeRun=EmployeeNo
And Company = '1'
AND Date = '2013-05-06'
SQL Server Management Studio에서 쉽게 생성할 수 있습니다.SELECT
삭제:
SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
실행할 수 있고 모든 연락처가 표시됩니다.
, 그럼 이번에는 '먹다', '먹다', '먹다', '먹다', 이렇게 .SELECT
a까지DELETE
:
DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
에서 본 SELECT
스테이트먼트가 삭제됩니다.
같은 순서로 보다 어려운 내부 조인을 작성할 수도 있습니다.다음은 예를 제시하겠습니다.
DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
다음 중 하나여야 합니다.
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
다음 쿼리를 사용해 보십시오.
DELETE WorkRecord2, Employee
FROM WorkRecord2
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1'
AND tbl_name.Date = '2013-05-06';
서브쿼리도 가능합니다.아래 코드와 같습니다.
DELETE FROM users WHERE id IN(
SELECT user_id FROM Employee WHERE Company = '1' AND Date = '2013-05-06'
)
하나의 은 ' 낫다'를 사용하는 것입니다.CTE
:
;WITH cte
AS (SELECT *
FROM workrecord2 w
WHERE EXISTS (SELECT 1
FROM employee e
WHERE employeerun = employeeno
AND company = '1'
AND date = '2013-05-06'))
DELETE FROM cte
주의: 사용할 수 없습니다.JOIN
에 inside inside inside CTE
때delete
.
현재 삭제 또는 업데이트에 사용하고 있는 것은 다음과 같습니다.
DELETE w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'
되어 있지 Company
★★★★★★★★★★★★★★★★★」Date
수정이 필요할 수도 있습니다.
을 사용한 MERGE
:
MERGE WorkRecord2 T
USING Employee S
ON T.EmployeeRun = S.EmployeeNo
AND Company = '1'
AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;
Devart의 답변도 표준 SQL이지만 불완전합니다.다음과 같이 표시됩니다.
DELETE
FROM WorkRecord2
WHERE EXISTS ( SELECT *
FROM Employee S
WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
AND Company = '1'
AND Date = '2013-05-06' );
위의 중요한 점은 스칼라 서브쿼리를 필요로 하는 두 번째 예에서 시행된 것처럼 삭제는 단일 테이블을 대상으로 하는 것이 분명하다는 것입니다.
다양한 독자 구문에 대한 답변은 읽기 어렵고 이해하기 어렵습니다.대한 마음가짐은 frans eilering의 답변에 가장 잘 설명되어 있다고 생각합니다.즉, 코드를 작성하는 사람은 코드를 읽고 관리하는 사람에 대해 반드시 신경을 쓰지 않습니다.
이것은 한 번에 2개의 테이블에서 레코드를 삭제하는 간단한 쿼리입니다.
DELETE table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
SQL Server 버전입니다.
DECLARE @ProfileId table(Id bigint)
DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email
DELETE FROM UserProfiles
WHERE Id = (Select Id FROM @ProfileId)
트랜잭션 블록, 테이블 변수 및 JOIN을 사용하여 여러 테이블 데이터를 삭제합니다.
BEGIN TRANSACTION;
declare @deletedIds table ( id int );
DELETE w
output deleted.EmployeeRun into @deletedIds
FROM WorkRecord2 w
INNER JOIN Employee e
ON e.EmployeeNo = w.EmployeeRun
AND w.Company = 1
AND w.date = '2013-05-06';
DELETE e
FROM Employee as e
INNER JOIN @deletedIds as d
ON d.id = e.EmployeeNo;
COMMIT TRANSACTION;
URL https://dbfiddle.uk/ ?rdbms = sqlserver_2014&sql= 43330dda6f1b71b8ec4172a24d5b6921에서 확인하십시오.
임시 테이블과 JOIN을 사용하여 여러 테이블 데이터를 삭제합니다.삭제 후 임시 테이블을 삭제합니다.
BEGIN TRANSACTION;
-- create temporary table
create table #deletedRecords (employeeId int);
-- INSERT INTO #deletedRecords
SELECT e.EmployeeNo
FROM WorkRecord2 w
INNER JOIN Employee e
ON e.EmployeeNo = w.EmployeeRun
AND w.Company = 1
AND w.date = '2013-05-06';
-- delete from WorkRecord2
DELETE w
FROM WorkRecord2 w
INNER JOIN #deletedRecords d
ON w.EmployeeRun = d.employeeId;
-- delete from Employee using exists
DELETE
FROM Employee
WHERE EXISTS (SELECT 1
FROM #deletedRecords d
WHERE d.employeeId = EmployeeNo);
-- drop temporary table
DROP TABLE #deletedRecords;
COMMIT TRANSACTION;
URL https://dbfiddle.uk/ ?rdbms = sqlserver_2014&sql=d52c6c1ed91669d68s6bc91cb32d78에서 확인하십시오.
SELECT INTO를 사용하여 임시 테이블을 작성하는 다른 방법
BEGIN TRANSACTION;
SELECT e.EmployeeNo employeeId
INTO #deletedRecords
FROM WorkRecord2 w
INNER JOIN Employee e
ON e.EmployeeNo = w.EmployeeRun
AND w.Company = 1
AND w.date = '2013-05-06';
-- delete from WorkRecord2
DELETE w
FROM WorkRecord2 w
INNER JOIN #deletedRecords d
ON w.EmployeeRun = d.employeeId;
-- delete from Employee using exists
DELETE
FROM Employee
WHERE EXISTS (SELECT 1
FROM #deletedRecords d
WHERE d.employeeId = EmployeeNo);
-- drop temporary table
DROP TABLE #deletedRecords;
COMMIT TRANSACTION;
URL https://dbfiddle.uk/ ?rdbms = sqlserver_2014&sql= 0f02f05616ce5b4dcc8fc67c6cf1e에서 확인하십시오.
JOIN을 사용하여 단일 테이블 데이터 제거
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON e.EmployeeNo = w.EmployeeRun
AND w.Company = 1
AND w.date = '2013-05-06'
URL https://dbfiddle.uk/ ?rdbms = sqlserver _ 2014 & fla = 84a60d 1368556a8837281df 7979334a에서 확인하시기 바랍니다.
CTE를 사용하여 단일 테이블 데이터 삭제
WITH cte AS (
SELECT w.EmployeeRun
FROM WorkRecord2 w
WHERE EXISTS (SELECT 1
FROM Employee
WHERE EmployeeNo = w.EmployeeRun)
AND w.Company = 1
AND w.date = '2013-05-06'
)
DELETE
FROM cte
URL https://dbfiddle.uk/ ?rdbms = sqlserver_2014&filen=6590007b3c8c2ffad5563bd86606c5b1에서 확인하십시오.
하위 테이블에서 외부 키를 생성할 때 ON CASCADE DELETE를 사용합니다.상위 테이블 데이터를 제거하면 해당 하위 테이블 데이터가 자동으로 삭제됩니다.
언급URL : https://stackoverflow.com/questions/16481379/how-can-i-delete-using-inner-join-with-sql-server
'programing' 카테고리의 다른 글
NSMutable 딕셔너리에 액세스하기 위한 Objective-C의 각 루프에 대해 (0) | 2023.04.12 |
---|---|
Swift에서 문자열을 연결하려면 어떻게 해야 하나요? (0) | 2023.04.12 |
WPF 버튼의 디폴트 마우스 오버 효과를 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
어떻게 하면 한 사용자의 커밋만 git 로그를 볼 수 있나요? (0) | 2023.04.12 |
performSelector의 셀렉터를 알 수 없기 때문에 누수가 발생할 수 있습니다. (0) | 2023.04.12 |