涉及两个表的 SQL Server 删除查询

5
在SQL Server中,我有A和B两个表,分别具有列a和b。以下是我想在伪查询命令中实现的内容,但我似乎无法弄清楚。

我想要:

DELETE FROM A 
WHERE a < 100 "and only if these selected (for deletion) values don't exist in column b in table B"

原因是我尝试从表A中删除一些数据,但它给出了一个错误,说在A.a和B.b之间存在约束。

这是否涉及别名?这很令人困惑...


你正在使用哪个版本的SQL Server? - Abe Miessler
1个回答

11

如果您使用的是SQL Server 2005或更新版本,请尝试以下操作:

DELETE FROM TableA
WHERE a < 100 AND 
a NOT IN (SELECT B FROM TableB)

对于 SQL Server 2000,这应该可以工作:

DELETE ta
FROM TableA as ta
LEFT JOIN TableB as tb
ON ta.a = tb.b
WHERE ta.a < 100 AND  tb.b IS NULL

我不确定问题的意思,但是考虑到有约束违规,TableB.b可能是对TableA的外键查找吗?如果是这样的话,在删除语句中是否会有任何不同,除了在适当的子句中用'id'替换'a'之外? - shelleybutterfly
嗯,我不确定我理解了。我同意你的外键假设。这个删除操作基本上会删除TableA中任何未被TableB引用的记录,这似乎是他/她所需要的。 - Abe Miessler
@Abe Miessler,你的第一个查询工作得很好!看起来在MSSQL中,你可以强制执行一堆限制……?我最近在学习MySQL,但是在SQL Server Management Studio中似乎没有这些功能。 - laketuna
是的,你说得对,SQL Server确实有强制数据完整性的能力。虽然我对MySQL不是很熟悉,但我相当确定你可以强制执行引用完整性。请查看以下链接:http://www.databasejournal.com/features/mysql/article.php/2248101/Referential-Integrity-in-MySQL.htm,http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-foreign-keys.html - Abe Miessler
@Abe 嗯,我可能有点困惑。让我们看看第一个命令。在我的脑海中,我将第一个命令翻译成如下命令:<br/>“对于 TableA 中的每个 ARec,在(ARec.a < 100)和(对于 TableB 中的每个 BRec,非(ARec.a 等于 BRec.B))的情况下执行”<br/>换句话说,我认为正在比较每个 ARec.a 中的数字字段与 BRec.b 中也必须是数字字段的内容。<br/>至于第二个命令,非常类似;您正在使用 ta.a = tb.b 进行连接,因此如果 ta.a 是数字字段,则 ta.b 似乎也必须是数字。 - shelleybutterfly
@Abe 所以,我本来期望看到更像是“DELETE FROM TableA WHERE a < 100 AND id NOT IN (SELECT b FROM TableB)”这样的语句。换句话说,我假设TableB.b是一个指向TableA的外键,因此你需要比较TableA记录的id。显然,你的解决方案解决了OP的问题,但这似乎意味着我忽略了一些重要的东西。 - shelleybutterfly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接