这个问题已经在这里有一个答案:
- 访问SQL更新一个表的基础上的价值在同一个表加入 1回答
对于下面的查询:
UPDATE tempSpring_ASN AS t
SET t.RECORD_TYPE = (
SELECT TOP 1 RECORD_TYPE
FROM (
SELECT "A" AS RECORD_TYPE
FROM TABLE5
UNION ALL
SELECT "B" AS RECORD_TYPE
FROM TABLE5
)
);
我收到“操作必须使用一个可更新的查询。” 我听不懂。 我并不想更新联合查询。 我只是想更新与联合查询的输出(单值),否则可更新的记录。
(在提供的解决方案访问SQL更新一个表中,根据在同一表中的值加入 (这也是下面提供)没有针对这种情况,相反的是在本页面的上方显示的工作。)
这个问题是我们在此发布前一个问题,数据和代码示例参考:
访问SQL更新一个表的基础上的价值在同一个表加入
嗨AYS,
在Access中,更新查询需要在一个表上运行。 如UNION查询是多组的记录的组合,则结果集不再是表,并且如在结果集中的记录不再唯一地与任何一个特定的表中标识不能更新查询的对象(甚至如果他们在理论上可以)。 访问是硬编码的对待每一个UNION查询为只读,这是有道理的,当有多个基础表。 还有一些其他条件(如SELECT语句中的一个子查询)也触发这个条件。
如果你没有使用TOP 1的UNION查询返回的多个结果,怎么会知道JET适用于你的表格中唯一的记录,其结果是:想如果这样说? 因此,JET将所有这样的情况相同。
不幸的是,即使所有的数据都从同一个表中导出的情况。 在这种情况下,很可能的是,JET优化是不够明智地意识到这种情况并重新短语不使用UNION的方式查询。
在这种情况下,你仍然可以得到你想要的东西通过重新说明你的查询以这样的方式,一切都引用基表。 例如,你可以使用下面的SELECT查询来获取先前SHP_CUSTOM_5记录的PO_NUM值:
SELECT
t1.SHP_CUSTOM_5
, t1.PO_NUM
, t1.SHP_CUSTOM_5 -1 AS PREV_RECORD
, (SELECT
t2.PO_NUM
FROM
tempSpring_ASN As t2
WHERE
t2.SHP_CUSTOM_5 = (t1.SHP_CUSTOM_5 -1)
) AS PREV_PO
FROM
tempSpring_ASN AS t1
;
然后,您可以短语以此为更新查询,如下所示,以执行“LIN”的更新:
UPDATE
tempSpring_ASN AS t1
SET
t1.RECORD_TYPE = "LIN"
WHERE
t1.PO_NUM=
(
SELECT
t2.PO_NUM
FROM
tempSpring_ASN As t2
WHERE
t2.SHP_CUSTOM_5 = (t1.SHP_CUSTOM_5 -1)
)
;
此代码是成功的在我与虚拟数据运行测试。
关于你的“人类发展报告”的更新,你真的执行两个单独的更新。 1)如果PO_NUM先前记录的PO_NUM,设置RECORD_TYPE匹配“LIN” 2)如果是第一个记录,设置RECORD_TYPE为“HDR”
这是我不清楚为什么会有一个查询中执行这些操作是有利的。 我会建议执行使用“TOP 1”你在原来的SELECT查询示例中使用SHP_CUSTOM_5方法HDR更新,因为这将是一个相对简单的UPDATE查询。 它可以更新查询中使用IIF(),但我不知道你会从将被要求额外的时间和复杂性中获得什么额外的好处(这很可能会只少得多可读)。
祝您好运!
文章来源: Is there a way to include a query that is non updateable in an UPDATE query? [duplicate]