【问题标题】:SQL Server delete query involving two tables涉及两个表的 SQL Server 删除查询
【发布时间】:2011-08-12 22:14:58
【问题描述】:

所以我在 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?

标签: sql sql-server sql-delete


【解决方案1】:

如果您使用的是 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”之外,删除的形式会有什么不同吗?
  • 嗯,我不确定我是否理解。我同意你的外键假设。此删除基本上会从 TableA 中删除任何未被 TableB 引用的记录,这似乎是他/她需要的。
  • @Abe Miessler,您的第一个查询效果很好!看起来在 MSSQL 中你可以强制执行一堆限制..?我最近在学习 MySQL,但我在 SQL Server Management Studio 中似乎没有看到任何这些功能。
  • 是的,你是对的,SQL Server 确实具有强制数据完整性的能力。虽然我不太精通 MySQL,但我相当肯定您可以强制执行引用完整性。看看这些链接:databasejournal.com/features/mysql/article.php/2248101/…, dev.mysql.com/doc/refman/5.0/en/ansi-diff-foreign-keys.html
  • @Abe 嗯,好吧,我可能会感到困惑。让我们执行第一个命令。在我的脑海中,我将第一个命令翻译成如下命令:
    “ForAll(TableA 中的 ARec)Where (ARec.a 换句话说,在我看来,正在比较的是每个 ARec.a 中的数字字段与 BRec 中也需要是数字字段的内容; BRec.b.
    至于第二个,非常相似;你加入 ta.a = tb.b 所以如果 ta.a 是一个数字字段,看起来 ta.b 也必须是数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多