【问题标题】:Convert Access delete statement to SQL Server将 Access 删除语句转换为 SQL Server
【发布时间】:2013-08-29 10:35:38
【问题描述】:

我正在将 Access 转换为 SQL,但我被这个 Delete 语句卡住了,因为我不确定它到底做了什么。

DELETE TableA.cID, TableB.*
FROM TableA RIGHT JOIN TableB ON TableA.cID = TableB.CID2
WHERE (((TableA.cID) Is Null));

我猜是这样的:

Delete
from TableA right join TableB ON TableA.cID = TableB.CID2
Where TableA.cID is null

我不确定它是否应该从 1 个表或 2 个表中删除或..

【问题讨论】:

  • 你想做什么?您想从 tableA 或 table2 中删除吗?请简单解释一下。
  • 我试图弄清楚访问查询在做什么

标签: sql-server ms-access join sql-delete


【解决方案1】:

你想要:

Delete TableB
from TableA right join TableB ON TableA.cID = TableB.CID2
Where TableA.cID is null

就个人而言,我总是避免右连接,因为可以通过切换表的顺序来说明相同的事情。我会像这样重写语句:

DELETE B
FROM TableB AS B LEFT JOIN TableA AS A ON B.CID2 = A.cID
WHERE A.cID IS NULL

更多信息请参见T-SQL: Selecting rows to delete via joins


至于那个查询实际上在做什么,这里是一个简短的描述:

删除 TableB 中对于条件 TableB.CID2 = TableA.cID 中 TableA (TableA.cID IS NULL) 中不存在匹配记录的所有行

【讨论】:

  • 但是访问查询不是一次从2个表中删除吗?
  • 不,它不是从表 2 中删除
  • 不,DELETE TableA.cID, TableB.*TableA.cID 部分可能是 Access 的按设计查询视图的产物。最初的程序员可能从 TableA 中双击了 cID 字段以将该字段添加到查询设计网格(这是将 TableA.cID 添加到查询的第一行的部分),然后输入 Is Null查询设计网格的 TableA.cID 列的 Criteria 行,以便 只有 TableB 中具有 no 在 TableA 中对应的行 将被查询删除。查询第一行中的TableB.* 告诉 Access 仅从 TableB 中删除。
猜你喜欢
  • 2020-11-23
  • 2017-09-08
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
相关资源
最近更新 更多