更新作为选择标准一部分的列应该没有问题我想/想 我仍然有一个给出奇怪结果的查询:
update table1 as t1
inner join table2 as t2 on t1.id = t2.old_id
set t1.id = t2.id
我使用table2将id映射到old_id table1.id和table2.id都是主键。 table2.old_id也是唯一的。
在此更新后,table1.id仍然是唯一的 错误! MS Access会发出隆隆声,有一些重复的table.id值。
我认为这是更新连接中使用的列的正确方法吗?我们怎样才能在MS Access中实现预期的结果?
注意:table2是通过ODBC访问的mysql视图。
答案 0 :(得分:1)
table1.id和table2.id都是 主键。 table2.old_id也是 唯一的。
然后table1.id仍然会 在此更新后是独一无二的。
不一定如此。
似乎old_ID和(新)ID具有相同的数据类型。 table1中基于谓词(table1.ID = table2.old_ID
)在table2中没有匹配行的行不会更新。另一行可以匹配(新)ID值,因此得到更新,其值与未更新的行相同。
这是使用标准SQL(在SQL Server 2008中工作,而不是Access / Jet)的示例,我希望您可以遵循。请注意,我使用INNER JOIN
构造重新编写了EXISTS
,以符合我要传达的逻辑:
WITH Table1 (ID) AS
(
SELECT ID
FROM (
VALUES (1),
(2),
(3),
(4)
) AS Table2 (ID)
),
Table2 (old_ID, ID) AS
(
SELECT old_ID, ID
FROM (
VALUES (1, 55),
(2, 99),
(3, 4)
) AS Table2 (old_ID, ID)
)
-- ID of rows that will not be updated:
SELECT T1.ID
FROM Table1 AS T1
WHERE NOT EXISTS (
SELECT *
FROM Table2 AS T2
WHERE T1.ID = T2.old_ID
)
UNION ALL
-- updated IDs
SELECT T2.ID
FROM Table2 AS T2
WHERE EXISTS (
SELECT *
FROM Table1 AS T1
WHERE T1.ID = T2.old_ID
);
结果集:
ID
---
4 --<-- duplicate
55
99
4 --<-- duplicate
换句话说,即使以下所有内容都是唯一的:
(table1.ID)
(table2.ID)
(table2.old_ID)
......以下内容可能包含重复项:
table1.ID
UNION ALL
table2.ID
答案 1 :(得分:0)
不一致支持在UPDATE语句中使用JOIN,这就是为什么它们不是我习惯使用的原因。
UPDATE TABLE1 AS t1
SET t1.id = (SELECT t2.id
FROM TABLE2 t2
WHERE t2.old_id = t1.id)