您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

根据同一表中的值访问联接中的SQL更新一个表

根据同一表中的值访问联接中的SQL更新一个表

我还在您的新问题中发布了此答案。

嗨,AYS,

在Access中,需要在表上运行更新查询。由于UNION查询是多组记录的组合,因此结果集不再是表,并且不能成为Update查询的对象,因为结果集中的记录不再与任何一个特定的表唯一地标识(甚至(如果理论上可以)。访问经过硬编码,以将每个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
;

然后,您可以按如下所示将此短语表述为Update查询,以执行“ 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)
)
;

代码在我使用伪数据进行的测试中成功。

关于“ HDR”更新,您实际上是在执行两个单独的更新。1)如果PO_NUM与先前记录的PO_NUM相匹配,则将RECORD_TYPE设置为“ LIN” 2)如果是第一条记录,则将RECORD_TYPE设置为“ HDR”

我不清楚,为什么在一个查询中执行这些操作会有好处。我建议您使用原始SELECT查询示例中使用的SHP_CUSTOM_5方法中的“ TOP 1”执行HDR更新,因为这将是一个相对简单的UPDATE查询。可以在Update查询中使用IIF(),但我不知道您会从所需的额外时间和复杂性中获得什么额外的好处(它极有可能可读性较低)。

祝你好运!

SQLServer 2022/1/1 18:48:50 有390人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶