在更新连接列时,Ms Ms会提供垃圾

时间:2010-07-21 17:56:56

标签: sql ms-access

更新作为选择标准一部分的列应该没有问题我想/想 我仍然有一个给出奇怪结果的查询:

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视图。

2 个答案:

答案 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)