Удалить запись из нескольких таблиц, используя определенное значение - PullRequest
1 голос
/ 12 июня 2019

Сегодня, Я хочу удалить всю тестовую запись из нескольких таблиц в sql server. Вот чего я хочу добиться ..

Select ID from sourceTable where acctType='S' and acctroot<>0

Предположим, этот запрос возвращает 5 строк.

   | ID|
    ---
   | 1 |
   | 2 |
   | 3 |
   | 4 |
   | 5 |

Теперь вот таблицы, которые мне нужно почистить

delete from tmpA where ID=1
delete from tmpB where acctID=1
delete from tmpC where userID = 1
delete from tmpD where sID=1
.
.
.
delete from tmpA where ID=2
delete from tmpB where acctID=2
delete from tmpC where userID =2
delete from tmpD where sID=2

Могу ли я пройти по исходной таблице и извлечь идентификатор, а затем удалить из таблиц? Я знаю, что могу использовать соединения, но я хочу сделать это с помощью цикла While ..

Ответы [ 5 ]

2 голосов
/ 12 июня 2019

Просто так

... WHERE ID IN (Select ID from sourceTable where acctType='S' and acctroot<>0)

Как это:

delete from tmpA where ID IN (Select ID from sourceTable where acctType='S' and acctroot<>0)
delete from tmpB where acctID IN (Select ID from sourceTable where acctType='S' and acctroot<>0)
delete from tmpC where userID IN (Select ID from sourceTable where acctType='S' and acctroot<>0)
delete from tmpD where sID IN (Select ID from sourceTable where acctType='S' and acctroot<>0)
1 голос
/ 12 июня 2019

Вам не нужен цикл while для этого

    delete from tmpA where ID IN (Select ID from sourceTable where acctType='S' and acctroot<>0)
1 голос
/ 12 июня 2019

Вам не нужен цикл WHILE, вы можете сделать это следующим образом, используя WHERE EXISTS.

DELETE A 
FROM   tmpa a 
WHERE  EXISTS (SELECT 1 
               FROM   sourcetable s 
               WHERE  s.accttype = 'S' 
                      AND s.acctroot <> 0 
                      AND s.id = a.id) 

Вы должны сделать то же самое для других таблиц.

0 голосов
/ 12 июня 2019

Попробуйте,

Declare @Temp_Table Table (Id int identity(1,1),Table_Name varchar(30),Column_Name varchar(30))

insert into @Temp_Table
select 'tmpA','ID'
union all
select 'tmpB','acctID'
union all
select 'tmpC','userID'
union all
select 'tmpD','sID'

Declare @Counter int=1
        ,@Tot_Count int=0
        ,@Table_Name varchar(30)=''
        ,@Column_Name varchar(30)=''

select @Tot_Count=count(1) 
from @Temp_Table

While @Tot_Count >= @Counter
Begin

         Select @Table_Name=Table_Name
                ,@Column_Name=Column_Name
           From @Temp_Table
          Where Id=@Counter

           Exec
           (
                '
                 Delete A 
                   From '+@Table_Name+' A
             inner join sourceTable B 
                     on A.'+@Column_Name+'=B.ID
                  where B.acctType=''S'' 
                    and B.acctroot<>0
                '
           )

           Set @Counter+=1
End
0 голосов
/ 12 июня 2019

Еще один способ убедиться, что ваш идентификатор существует в исходном коде, - это INNER JOIN.

DELETE T
FROM tmpA T
     INNER JOIN sourcetable S ON S.id = T.id AND S.accttype = 'S' AND S.acctroot  <> 0  
...