2017-02-23 7 views
0

조건이 참일 때 여러 테이블에서 여러 행을 삭제하고 싶습니다.msSQL 다중 삭제 다중 조인

나는이 함께 삭제할 것을 선택할 수 있습니다

select * 
from ProcessStepSt01 
left join ProcessStepSt02 on ProcessStepSt01.Workpiece=ProcessStepSt02.Workpiece 
left join ProcessStepSt03 on ProcessStepSt01.Workpiece=ProcessStepSt03.Workpiece 
where ProcessStepSt01.Workpiece 
in (
select Workpiece from Workpieces 
where datediff(day,workpieces.CreationTime,current_timestamp)>=30 
) 

모든 ProcessStepStXX은 워크 (기본 키), TeilIO 시작, 엔데와 TeilVorh가 포함되어 있습니다. 그래서 결과는

Workpiece TeilIO TeilVorh Start Ende Workpiece_1 TeilIO_1 ... Workpiece_2 ... 
1111  1  1  1  1 (null)  (null)  (null) 
abc  1  1  1  1 abc   1   abc 

입니다하지만 선택 *을 삭제 교체 할 때 오류가 발생합니다 : "잘못된 구문은 다음 왼쪽 키워드"

또한

delete ProcessStepSt01,ProcessStepSt02,ProcessStepSt03 
시도

(선택 후 *는 모두 동일하게 유지됨)

하지만 '잘못된 것 ntax near ',' "

내가 원하는 것은 공작물이 in ... (...) 문에서 선택과 일치하는 ProcessStepSt01, ProcessStepSt02, ProcesStepSt03에서 모든 행을 삭제하는 것입니다.

그래서 여기 내 질문은 :

  1. 왜 내 구문이 작동하지 않는 이유는 무엇입니까?
  2. 어떻게 작동합니까?

마지막으로 내가

CREATE TRIGGER TRG_AutoRemove 
ON workpieces 
AFTER INSERT AS 
BEGIN 
... 
END 

주기적 을하고 싶지 그러나 모든 삽입이 조금 과잉 (약 삽입 매 2 ~ 3 초)이다와 나는 그 일을 생각한다.

한 시간에 한 번씩 할 수있는 방법이 있습니까?

참고 : MSSQL을 사용하고 있습니다.

귀하의 조언에 감사드립니다.

답변

0

동시에 두 개 이상의 테이블에서 삭제할 수 없으면 세 개의 delete 문을 사용해야합니다. 그러나이 경우 모든 테이블에 공작물이 있으므로이 명령문은 쉽습니다.

DELETE 
FROM ProcessStepSt03 
WHERE Workpiece 
IN (
SELECT Workpiece FROM Workpieces 
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30) 

DELETE 
FROM ProcessStepSt02 
WHERE Workpiece 
IN (
SELECT Workpiece FROM Workpieces 
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30) 

DELETE 
FROM ProcessStepSt01 
WHERE Workpiece 
IN (
SELECT Workpiece FROM Workpieces 
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30) 

SQL Agent를 통해 정기적으로 작업이 실행되도록 예약 할 수 있습니다.

물론 ProcessStep 테이블 중 하나가 기본 레코드이고 레코드가없는 경우 (예 : ProcessStepSt01이없는 경우 레코드가 ProcessStepSt02 또는 ProcessStepSt03에 존재할 수 없음) 외장을 설정할 수 있습니다 02와 03에서 01까지 키 관계를 삭제하고 계단식 삭제 그런 다음 ProcessStepSt01에서 삭제하기 만하면 다른 레코드가 자동으로 삭제됩니다.완성도를 들어


, 당신은 삭제 성명에서 테이블을 조인 할 않은 경우,이 같은 구문을 수행 할 수 있습니다

DELETE PS1 
FROM ProcessStepSt01 PS1 
    JOIN Workpieces W ON PS1.Workpiece = W.Workpiece 
WHERE DATEDIFF(day, W.CreationTime, current_timestamp) >= 30 

이것은 여전히 ​​당신이 중 하나를 삭제할 수 있습니다 JOIN의 테이블을 사용하지만, 서브 쿼리를 사용하는 것보다 논쟁의 여지가 있지만 가끔씩 조인하지 않고 필요한 것을 얻을 수없는 경우가 있습니다.

0

여기 여러 항목이 있습니다. 첫 번째 : 3 개의 테이블에서 동시에 삭제할 수 없으며 세 개의 별도 명령문이 필요합니다.

delete 
from ProcessStepSt01 
where Workpiece 
in (
    select Workpiece from Workpieces 
    where datediff(day,workpieces.CreationTime,current_timestamp)>=30 
) 

다른 테이블과 동일합니다.

하루에 한 번 실행되도록하려면 SQL Server 에이전트로 작업을 만드십시오. 진술을 T-SQL 단계에 넣고 하루에 한 번 예약하십시오.