2009-07-07 59 views
2

我想從問題表和關係表中刪除所有匹配測驗ID的記錄。該查詢適用於select語句,但不允許刪除相同的語句。SQL從相關表中刪除

@quizId是我傳入存儲過程的測驗Id值。有誰知道如何使用一條語句從兩個表中刪除?可能嗎?

DELETE tGeoQuestions as a, tGeoQuizToQuestion as b WHERE b.quizId = @quizId AND a.id = b.questionid 

回答

8

您需要啓用級聯刪除,然後它會自動地發生,所有你需要做的是從與PK,所有的FK表的表中刪除會被自動刪除

否則就是2步操作

這樣的事情,把這個在TRAN

DELETE a 
FROM tGeoQuestions as a 
JOIN tGeoQuizToQuestion as b 
ON a.id = b.questionid 
AND b.quizId = @quizId 


DELETE tGeoQuizToQuestion WHERE quizId = @quizId 

你的第三個選項是在PK臺上的觸發器,從刪除一切FK表,如果它被PK表中刪除...我不會推薦觸發器

+3

像湯姆一樣警告下面,小心使用級聯,因爲你會突然發現數據「丟失」 – 2009-07-07 20:05:40

0

據我所知,這是不可能在一個單一的SQL語句。如果你有合適的關係設置,刪除會自動級聯。否則你必須發出2條刪除語句。

0

你可以在MySQL delete這樣做手工表明,該方法爲

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] 
tbl_name[.*] [, tbl_name[.*] ...] 
FROM table_references 
[WHERE where_definition] 

在SQL Server中,我認爲你要麼需要使用外鍵或刪除的問題,其中競猜= ...,然後從測驗表

1

我不確定是否可以用同樣的方法從兩個表中刪除相同的語句,您可以從兩個表中選擇。這在Oracle中至少是不可能的。

由於SQLMenace提到你最好的選擇是打開級聯。

要小心Cascade雖然,如果你對它非常根深蒂固的結構,它很容易消滅大量的數據。

1

試試這個:

DELETE a 
FROM tGeoQuestions as a 
INNER JOIN tGeoQuizToQuestion as b ON a.id = b.questionid 
WHERE b.quizId = @quizId 

順便說一句,你的SELECT語句acctually工作(我不知道至極是你的發言......)。

您必須更換隻

SELECT ... 

DELETE [table name or alias] 

,離開一切不變。