0

Table1의 ID (t1ID)를 입력하는 저장 프로 시저에서 3 개의 관련 테이블에서 행을 삭제하려고합니다. 나는 데이터베이스 외부에 BLOB 저장소를 삭제해야하기 때문에저장 프로 시저 : 모든 행에 대해 출력이있는 여러 테이블의 행을 삭제합니다.

Table1  Table2  Table3 
-------  -------  ------- 
t1ID   t2ID   t3ID 
name   t1ID   t2ID 
      blobpath1 blobpath2 

나는, 절차에서 출력으로 모든 삭제 된 행의 blobpath1 및 blobpath2의 값을 얻을 필요가있다.

보통 내가 할 것이다 : 어떻게 내가 출력 blobpaths

Delete From [dbo].[Table3] Where t2ID IN 
(Select t2ID FROM [dbo].[Table2] Where [t1ID]= @t1ID) 
Delete From [dbo].[Table2] Where [t1ID]= @t1ID 
Delete From [dbo].[Table1] Where [t1ID]= @t1ID 

를?

+0

('SQL Server', 'Oracle' 등) 어떤 데이터베이스를 사용하고 있습니까? –

+0

SQL Azure를 사용하고 있습니다. – purbsel

답변

1

OUTPUT 절을 사용하면 간단하게 처리 할 수 ​​있습니다.

BEGIN TRANSACTION; 

DECLARE @blobpaths TABLE (blobpath VARCHAR(32)); 

DELETE t3 OUTPUT deleted.blobpath2 INTO @blobpaths 
FROM table3 t3 
JOIN table2 t2 ON t2.t2id = t3.t2id 
JOIN table1 t1 ON t1.t1id = t2.t1id 
WHERE t1.t1id = @t1ID; 

DELETE t2 OUTPUT deleted.blobpath1 INTO @blobpaths 
FROM table2 t2 
JOIN table1 t1 ON t1.t1id = t2.t1id 
WHERE t1.t1id = @t1ID; 

DELETE FROM table1 WHERE t1id = @t1ID; 

SELECT blobpath FROM @blobpaths; 

COMMIT TRANSACTION; 

An SQLfiddle to test with.

+0

첫 번째 삭제에서 where 조건을 얻지 못합니다. t1.t1id = @ t1ID이거나 뭔가 빠졌는가? select 쿼리가 너무 많아서이 버전의 성능이 향상 되었습니까? – purbsel

+0

@purbsel 예, 어디에서 선택 하든지간에 'where'는 내가 샘플에있는 것과 동일하게 유지했습니다. 귀하의 경우에 'Where t1.t1id = @ t1ID'가 맞는 것 같습니다. 성능에 관해서는 필자는 임시 테이블에 삽입/삽입하는 것보다 낫다고 생각하지만, 성능이 필수적이라면 언제나 그렇듯이 현실적인 데이터 세트로 테스트하는 것이 가장 좋습니다. –

+0

도움 주셔서 감사합니다. 하나의 실수 만 남았습니다 : 삭제 명령문의 순서. t3은 외래 키 관계 때문에 삭제할 첫 번째 테이블이어야합니다. 그래서 그 : 삭제 t3, 삭제 t2, 삭제 t1. Table deleted1은 더 이상 필요하지 않다고 생각합니다. – purbsel

1

당신은 마지막에 blobpath1blobpath2 값과 출력이를 저장하기 위해 임시 테이블을 만들 수 있습니다 당신은 내가 가정 한 SQL Server를 사용하는 RDBMS하는 확실치

-- Create a temporary table to hold results 
CREATE TABLE #tmpResults 
( blobpath VARCHAR(100) ) 

-- Get results from Table2 
INSERT INTO #tmpResults (blobpath) 
    SELECT blobpath1 
    FROM Table2 
    WHERE t1ID = @t1ID 

-- Get results from Table3 
INSERT INTO #tmpResults (blobpath) 
    SELECT t3.blobpath2 
    FROM Table3 t3 
     INNER JOIN Table2 t2 ON t2.t2ID = t3.t2ID 
    WHERE t2.t1ID = @t1ID 

-- Do your deletes as per your own code 


-- Output temporary table 
SELECT blobpath 
    FROM #tmpResults 

-- Tidy up 
DELETE #tmpResults 

참고. 다른 시스템 인 경우 임시 테이블 구문을 변경해야 할 수도 있습니다. blobpath 열이 VARCHAR(100) 인 것으로 가정 했으므로이 유형을 적절한 유형 및 크기로 변경해야합니다.

저장 프로 시저를 실행하면 삭제 한 blobpath1blobpath2의 값을 모두 포함하는 단일 열 (blobpath)이 포함 된 테이블 출력이 제공됩니다.

+0

이 솔루션도 완벽하게 작동하지만 코드가 적기 때문에 다른 솔루션을 선택했습니다. 빠른 지원에 감사드립니다. – purbsel

관련 문제