programing

SQL Server에서 INSER JOIN을 사용하여 삭제하려면 어떻게 해야 합니까?

codeshow 2023. 4. 12. 22:40
반응형

SQL Server에서 INSER JOIN을 사용하여 삭제하려면 어떻게 해야 합니까?

다음을 사용하여 삭제하고 싶다INNER JOINSQL 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 CTEdelete.

현재 삭제 또는 업데이트에 사용하고 있는 것은 다음과 같습니다.

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

반응형