【发布时间】:2013-01-29 12:55:47
【问题描述】:
我在 Access 中有一个名为“tempSpring_ASN”的表,其中包含以下字段(以及其他字段):
SHP_CUSTOM_5(自动编号)
RECORD_TYPE(文本)
PO_NUM(文本)。
我需要改变RECORD_TYPE的值,如果PO_NUM和上一条记录中的PO_NUM一样,那么RECORD_TYPE应该是“LIN”,否则(或者如果是第一条记录),RECORD_TYPE应该是“HDR” .
我创建了以下查询来获取 RECORD_TYPE 的正确新值:
SELECT TOP 1 t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
NULL AS PreviousValue,
"HDR" AS RECORD_TYPE
FROM tempSpring_ASN AS t1
ORDER BY t1.SHP_CUSTOM_5
UNION ALL
SELECT t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
t2.PO_NUM AS PreviousValue,
IIf([CurrentValue]=[PreviousValue],'LIN','HDR') AS RECORD_TYPE
FROM tempSpring_ASN AS t1,
tempSpring_ASN AS t2
WHERE t1.SHP_CUSTOM_5 = t2.SHP_CUSTOM_5 + 1
ORDER BY t1.SHP_CUSTOM_5;
我已将该查询保存为“tempSpring_ASN_With_PreviousRow”。现在我正在尝试使用它来更新原始 tempSpring_ASN 表,并使用以下查询:
UPDATE tempSpring_ASN INNER JOIN tempSpring_ASN_With_PreviousRow ON tempSpring_ASN.SHP_CUSTOM_5 = tempSpring_ASN_With_PreviousRow.SHP_CUSTOM_5 SET tempSpring_ASN.RECORD_TYPE = [tempSpring_ASN_With_PreviousRow].[RECORD_TYPE];
但我得到了,“操作必须使用可更新的查询。”我不确定是因为我试图更新连接中的一个表,还是因为我试图根据同一个表中的值更新表,或者是由于其他原因。无论如何,我正在寻找可行的方法。
谢谢!
更新(没有双关语):
我尝试了以下更新查询:
UPDATE tempSpring_ASN INNER JOIN Table5 ON tempSpring_ASN.SHP_CUSTOM_5 = Table5.SHP_CUSTOM_5 SET tempSpring_ASN.RECORD_TYPE = "zzz";
而且效果很好。结果是 tempSpring_ASN 已更新,但 Table5 没有。显然,如果在一条 SQL 语句中连接了两个表,即使您对一个表运行更新,它仍然不会尝试更新连接中的另一个表。既然如此,我不确定为什么我原来的更新查询不起作用。我知道 tempSpring_ASN_With_PreviousRow 不可更新,因为它是一个 UNION 查询,但我没有尝试更新它。相反,我正在尝试更新 tempSpring_ASN——连接中的另一个表,是可更新的。
更新 2: 然后我尝试使用如下相关子查询:
UPDATE tempSpring_ASN AS t
SET t.RECORD_TYPE = (
SELECT RECORD_TYPE
FROM (
SELECT TOP 1 t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
NULL AS PreviousValue,
"HDR" AS RECORD_TYPE
FROM tempSpring_ASN AS t1
ORDER BY t1.SHP_CUSTOM_5
UNION ALL
SELECT t1.SHP_CUSTOM_5,
t1.PO_NUM AS CurrentValue,
t2.PO_NUM AS PreviousValue,
IIf([CurrentValue] = [PreviousValue], 'LIN', 'HDR') AS RECORD_TYPE
FROM tempSpring_ASN AS t1,
tempSpring_ASN AS t2
WHERE t1.SHP_CUSTOM_5 = t2.SHP_CUSTOM_5 + 1
ORDER BY t1.SHP_CUSTOM_5
)
WHERE SHP_CUSTOM_5 = t.SHP_CUSTOM_5
);
但我仍然收到“操作必须使用可更新查询”。
更新 3:
我认为该错误是由于我使用联合查询造成的。为了隔离问题,我尝试了以下方法(这不会给我想要的结果,但会帮助我诊断问题。):
UPDATE tempSpring_ASN AS t
SET t.RECORD_TYPE = (
SELECT TOP 1 RECORD_TYPE
FROM tempSpring_ASN_With_PreviousRow
);
它给了我同样的错误。所以现在的问题变成了,为什么我不能使用联合查询输出的单个值来设置记录集中的值?
【问题讨论】:
-
您是否尝试过使用查询设计并右键单击查询文本区域并选择更新查询的查询类型?
-
是的,我做到了。功能区的“设计”选项卡上已选择“更新”。
-
问题不在于您的联接,而在于包含 UNION 的查询。无法更新带有 UNION 语句的查询。有关可能导致更新失败的其他示例,请参阅此链接:[office.microsoft.com/en-us/access-help/…
-
@Zaider,谢谢。你是对的。 (我已经更新了我的问题。)但是,我并没有尝试更新联合查询,而是只更新连接中的另一个表。
-
我创建了一个新帖子,以便更容易理解:stackoverflow.com/questions/14885363/…
标签: sql ms-access sql-update