2

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

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

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

5 回答 5

9

您需要启用级联删除然后它会自动发生,您需要做的就是从带有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 

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

于 2009-07-07T20:00:46.353 回答
2

试试这个:

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

顺便说一句,您的 select 语句确实有效(我不知道您的语句是什么......)。

您只能更换

SELECT ...

DELETE [table name or alias]

并保持其他一切不变。

于 2009-07-07T20:14:52.940 回答
1

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

正如 SQLMenace 提到的,最好的选择是打开级联。

但是要小心 Cascade,如果你的结构中根深蒂固,那么很容易清除大量数据。

于 2009-07-07T20:03:47.563 回答
0

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

于 2009-07-07T20:03:14.723 回答
0

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

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

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

于 2009-07-07T20:03:16.160 回答