2017-10-16 2 views
0

나는 아래의 쿼리를 사용하여 삭제하려고하지만 불행히도, 모든 기록은하위 쿼리 및 교차를 사용하여 삭제 하시겠습니까?

DELETE [dbo].[devicelinks] 
FROM 
    (SELECT * 
    FROM [dbo].[devicelinks] 
    WHERE PID = 7 

    INTERSECT 

    SELECT * 
    FROM ASC.dbo.DEVICE_LINK 
    WHERE PID = 7) 

어떻게 제대로 소스 테이블에서 해당 레코드를 삭제하기 위해 하위 쿼리를 사용하여 삭제?

두 테이블 중 하나에 키 또는 제약 조건이 없습니다. 당신은 기록을 감지하는 EXISTS을 사용할 수 있습니다

답변

1

이가

delete [dbo].[devicelinks] 
from [dbo].[devicelinks] 
    inner join ASC.dbo.DEVICE_LINK 
    on [dbo].[devicelinks].PID = ASC.dbo.DEVICE_LINK.PID 
where [dbo].[devicelinks].PID = 7 
+0

나는 이것을 시도 할 수 있지만 바인딩 목록에서 두 개 이상의 열을 확인해야합니다. – coffemug

+0

"and [dbo]."와 같은 조인 절을 추가 할 수 있습니다. [devicelinks] .MyField = ASC.dbo.DEVICE_LINK.MyField "You cha가 필요로하는 것 중 많은 수를 가지고 있습니다 – RegBes

+0

추천, 하위 쿼리 또는 합류 – coffemug

2

삭제합니다 :

DELETE d1 
FROM [dbo].[devicelinks] d1 
WHERE PID = 7 AND EXISTS (SELECT * 
          FROM ASC.dbo.DEVICE_LINK AS d2 
          WHERE d1.PID = d2.PID AND 
           d1.[DEVICEID] = d2.[DEVICEID] AND 
           ... rest of the fields here) 
+0

완벽한하려고주십시오. ........ – coffemug

+0

큰 데이터 세트에서 EXISTS 및 중첩 된 조인으로 성능 문제가 발생할 수 있습니다. – RegBes

+1

@RegBes - 더 큰 데이터 세트에 대한 쿼리에 성능 문제가 발생할 수 있습니다. 'EXISTS'는 본질적으로 당신이 암시하려고하는 대답보다 나쁘지 않습니다. SQL Server에는 정규 조인만큼 효율적으로 수행 할 수있는 세미 조인 논리 연산자가 있습니다. –

관련 문제