从相关表中删除SQL

时间:2009-07-07 19:57:03

标签: sql delete-row

我正在尝试删除与问题表和关系表中的测验ID匹配的所有记录。该查询适用于select语句,但不允许删除相同的语句。

@quizId是我传递到存储过程的测验ID值。有谁知道如何使用一个语句从两个表中删除?可能吗?

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

5 个答案:

答案 0 :(得分:8)

你需要启用级联删除然后它会自动发生,你需要做的就是从PK表中删除所有fk表将被自动删除

否则这是一个两步操作

像这样的东西,把它放在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 

你的第3个选项是PK表上的一个触发器,如果​​它在PK表中被删除,它将从FK表中删除所有内容......我不推荐触发器

答案 1 :(得分:1)

我不确定是否可以从同一语句中的两个表中删除,就像从两个表中选择一样。至少在Oracle中是不可能的。

正如SQLMenace所提到的,最好的办法就是打开级联。

小心使用Cascade,如果你在你的结构中根深蒂固,那么很容易消灭很多数据。

答案 2 :(得分:1)

试试这个:

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

顺便说一句,你的选择陈述实际上是有效的(我不知道你的陈述是什么......)。

您必须只替换

SELECT ...

DELETE [table name or alias]

并将其他所有内容保持不变。

答案 3 :(得分:0)

据我所知,这在单个SQL语句中是不可能的。如果您具有正确的关系设置,则删除将自动级联。否则你将不得不发出2个删除声明。

答案 4 :(得分:0)

您可以在mysql delete中执行此操作,手册将方法显示为

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

在SQL服务器中,我认为您需要使用外键或从问题中删除quiz = ...然后从测验表