2017-04-11 6 views
0

[Tabellenbeziehungen] [1]Wie aus 2 Tabellen löschen

table **Student**

table **Student_Grade**

Hier sind die Screenshots auf meiner Datenbank.

Ich möchte alle Daten aus der Tabelle Student mit der Tabelle Student_grade wo Grade='FAIL' löschen.

ALLE Informationen der fehlgeschlagenen Studenten sollten aus der Datenbank gelöscht werden.

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

Versucht dies, aber es funktioniert nicht. Ich denke, Daten sollten aus beiden Tabellen auf einmal gelöscht werden, denn wenn es aus einer Student Tabelle löscht, gibt es keine Referenzen für FK in student_grade Tabelle.

Bitte kann jemand die SQL Server-Abfrage dazu bereitstellen?

+0

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

+0

put TOP 1 in Ihrem wählen und ändern IN = – CurseStacker

Antwort

1

Ich mag eigentlich Squirrel Temp Ansatz (+1). Es ermöglicht ein komplexeres Auswahlkriterium.

Das heißt, wenn #temp Tabellen "off-the-table" sind, können Sie folgendes tun:

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

können Sie nicht aus 2 Tabellen auf einmal löschen.

Behalten Sie die Liste von studend_id bei, die in einer temporären Tabelle gelöscht werden soll, und verwenden Sie diese dann, um der tatsächlichen Tabelle beizutreten und eine nach der anderen zu löschen.

-- 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

Zweiweg Es tut es ist.

erste Art und Weise, Transaktions Verwendung, wenn mehr als eine DML mit

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 

Ein anderer Weg

löschen Cascade

zu verwenden ist, wenn Sie übergeordnete Tabelle gerade löschen möchten Weg. Delete data with foreign key in SQL Server table