代码之家  ›  专栏  ›  技术社区  ›  Exception e

Ms Access在更新联接列时提供垃圾信息

  •  0
  • Exception e  · 技术社区  · 14 年前


    我仍然有一个查询会给出奇怪的结果:

    update table1 as t1 
    inner join table2 as t2 on t1.id = t2.old_id
    set t1.id = t2.id
    

    我使用表2将id映射到旧的\u id。
    table1.id和table2.id都是主键。表2.旧的\u id也是唯一的。


    错了! MS Access将对此发出隆隆声,其中包含一些重复的table.id值。

    但是,我认为这是更新联接中使用的列的正确方法吗?如何在MS-Access中达到预期的效果?

    2 回复  |  直到 14 年前
        1
  •  1
  •   onedaywhen    14 年前

    table1.id和table2.id都是 主键。表2.旧的\u id也是

    在此更新后保持唯一。

    似乎旧的\u ID和(新的)ID是相同的数据类型。表1中的一行,它在表2中没有基于谓词的匹配行( table1.ID = table2.old_ID )不会更新。另一行可以匹配一个(新的)ID值,因此可以使用与未更新的行相同的值进行更新。

    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
    
        2
  •  0
  •   OMG Ponies    14 年前

    在UPDATE语句中使用连接并没有得到一致的支持,这就是为什么我不习惯使用它们的原因。

    UPDATE TABLE1 AS t1
       SET t1.id = (SELECT t2.id
                      FROM TABLE2 t2
                     WHERE t2.old_id = t1.id)