2017-04-11 142 views
0

表关系]删除[1]如何从2个表使用SQL Server连接查询

table **Student**

table **Student_Grade**

这里是我的数据库的截图。

我想从Student表中删除所有数据,使用Student_grade表,其中Grade='FAIL'

失败学生的所有信息都应该从数据库中删除。

Delete from Student 
where Student_ID IN (Select Student_ID 
        from Student_Grade 
        where Grade = 'FAIL'); 

试过这个,但它不工作。我认为数据应该一次从两个表中删除,因为当它从一个Student表中删除时,在student_grade表中没有对FK的引用。

请任何人都可以提供SQL Server查询来做到这一点?

+0

探索ON DELETE CASCADE:http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server –

+0

把TOP 1放在你选择的位置,并将IN改为= – CurseStacker

回答

1

我其实很喜欢松鼠的临时做法(+1)。它允许一个更复杂的选择标准。

也就是说,如果#TEMP表是“现成的表”,你可以做到以下几点:

Delete A 
From Student A 
Join Student_grade B on (A.Student_ID=B.Student_ID) 
Where B.Grade='Fail'; 

Delete From Student_grade Where Grade='Fail'; 
2

您无法一次从2个表中删除。

将studend_id的列表保存在临时表中,然后使用它连接到实际表并一次删除一个表。

-- put the list of Fail students in temp table #Fail 
Select Student_ID INTO #Fail from Student_Grade where Grade='FAIL' 

-- delete from grade table 
DELETE g FROM #Fail f INNER JOIN Student_Grade g ON f.Student_ID = g.Student_ID 

-- delete from student table 
DELETE s FROM #Fail f INNER JOIN Student s ON f.Student_ID = s.Student_ID 
0

有双向做。

第一种方法,利用交易使用一个以上的DML

begin try 
begin tran 

-- Child table 
Delete From Student_grade Where Grade='Fail'; 

-- Parent table 
Delete A 
From Student A 
Join Student_grade B on (A.Student_ID=B.Student_ID) 
Where B.Grade='Fail'; 



commit TRAN 
end try 
begin catch 
if (@@Trancount>0) 
rollback 
end catch 

另一种方法是使用

删除级联

,如果你想删除父表直时远。 Delete data with foreign key in SQL Server table