SQL 有 3 个标准使用 Access

SQL with 3 criteria using Access

大家早上好

我正在使用 Access 2010,目前有以下 SQL 可以正常工作:

代码:

DELETE DISTINCTROW tbl_added.*
FROM tbl_added INNER JOIN tbl_removed ON (tbl_added.SPECIAL_NEED_TYPE = tbl_removed.SPECIAL_NEED_TYPE) AND (tbl_added.NUM_CUST = tbl_removed.NUM_CUST);

我正在尝试添加另一个条件但出现错误:

代码:

DELETE DISTINCTROW tbl_added.*
FROM tbl_added INNER JOIN tbl_removed ON (tbl_added.SPECIAL_NEED_TYPE = tbl_removed.SPECIAL_NEED_TYPE) AND (tbl_added.NUM_CUST = tbl_removed.NUM_CUST) AND (tbl_added.ADDED_REMOVAL_DT < tbl_removed.ADDED_REMOVAL_DT) ;

收到错误:

Could not delete from specified tables

我添加的最后一个条件是日期

在 Access SQL 中,您无法加入“<”。

您必须使用某种子查询或使用要删除的这些 ID 创建临时 table,然后加入其中。

编辑:

好吧,你 "can" 但不在 GUI 设计器中(请参阅 Erik 的评论)。

所以,按照通常的方式在 GUI 设计器中添加连接。这将使用“=”创建连接。然后切换到 SQL 视图并将“=”更改为“<”。

现在应该 运行 没有错误,但您将无法切换回 GUI 设计器。

加入任何非 = 的运算符时,您的记录集将变为 non-updateable。这意味着您无法编辑或删除。

您可以将所有比较移动到 WHERE 子句,并改用 CROSS JOIN,如下所示:

DELETE DISTINCTROW tbl_added.*
FROM tbl_added, tbl_removed 
WHERE (tbl_added.SPECIAL_NEED_TYPE = tbl_removed.SPECIAL_NEED_TYPE) AND (tbl_added.NUM_CUST = tbl_removed.NUM_CUST) AND (tbl_added.ADDED_REMOVAL_DT < tbl_removed.ADDED_REMOVAL_DT) ;

但是,这仍然不可更新,因为 CROSS JOIN 不可更新。

解决方案是将所有 = 比较保留在 INNER JOIN 中,并将所有其他比较移动到 WHERE 子句:

DELETE DISTINCTROW tbl_added.*
FROM tbl_added INNER JOIN tbl_removed ON (tbl_added.SPECIAL_NEED_TYPE = tbl_removed.SPECIAL_NEED_TYPE) AND (tbl_added.NUM_CUST = tbl_removed.NUM_CUST) 
WHERE (tbl_added.ADDED_REMOVAL_DT < tbl_removed.ADDED_REMOVAL_DT) ;

这使记录集保持可更新,并且仍然允许您使用 < 运算符。