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) ;
这使记录集保持可更新,并且仍然允许您使用 <
运算符。
大家早上好
我正在使用 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) ;
这使记录集保持可更新,并且仍然允许您使用 <
运算符。