【问题标题】:Merge 2 tables to fill in missing records in each - Access / SQL合并 2 个表以填充每个表中的缺失记录 - Access / SQL
【发布时间】:2021-10-30 07:26:30
【问题描述】:

我有 2 个表,它们具有相同的标题和相同的行数和列数 - 唯一的区别是 Table1 中的记录将在 Table2 中丢失,反之亦然。 因此,如果 Table1 有 50% 的记录,那么 Table2 将有另外 50%。

我想合并这 2 个表以获得完整的 1。我尝试了 JOINS、UNION ALL、UPDATE & INSERT INTO 并且没有工作

UNION ALL is close by 对所有具有“多值字段”的列给出错误,而 UPDATE / INSERT INTO 由于多值字段而给出错误。 INNER JOIN 根本不填空。

表 1

--ID--Header1--Header2--Header3 
   1    app1              org1
   2            lem2       
   3    app3              org3
   4            lem4      

表 2

--ID--Header1--Header2--Header3 
   1            lem1     
   2    app2              org2
   3            lem3       
   4    app4              org4

【问题讨论】:

  • 那么,对于您提供的示例数据,您在这里的预期结果是什么?也许您正在寻找FULL OUTER JOIN
  • "UNION ALL was close by 为所有具有“多值字段”的列提供错误" - 确切的错误消息是什么?
  • Larnu-expect 的结果是所有空白都填在一个表中 - 无论是在新表还是现有表(表 1 或表 2)中
  • Dai - 它只是在所有单元格中显示#ERROR,并且没有显示任何记录
  • @user15068397 有,但您需要首先修复您的数据库设计 - 通过将列更改为标量文本列,而不是多值列。

标签: sql ms-access ms-access-2010


【解决方案1】:

对于您的示例数据,您可以使用inner join

select t1.id, nz(t1.header1, t2.header1),
       nz(t1.header2, t2.header2),
       nz(t1.header3, t2.header3)
from table1 t1 inner join
     table2 t2
     on t1.id = t2.id

【讨论】:

  • Nz( x, y ) 仅适用于在 Access 内部运行的 SQL - 在外部使用 JET 或 ACE 时,您需要使用 IIF( x IS NULL, y, x )。 (只需添加此提示以帮助需要在 Access 之外执行此操作的任何人)。
  • 这不起作用。它说“多值字段在 nz(..) 中无效”
【解决方案2】:

假设table1table2 没有完全匹配的ID 值,并且您希望固定数据出现在table3 中,那么您将需要UNION(而不是@987654326 @) 和LEFT OUTER JOIN,像这样:

INSERT INTO table3( ID, Header1, Header2, Header3 )
SELECT
    u.ID,
    u.Header1,
    u.Header2,
    u.Header3
FROM
    (
        SELECT
            t1.ID,
            IIF( ( t1.Header1 IS NULL OR LEN(t1.Header1) = 0 ) AND t2.Header1 IS NOT NULL, t2.Header1, t1.Header1 ) AS Header1,
            IIF( ( t1.Header2 IS NULL OR LEN(t1.Header2) = 0 ) AND t2.Header2 IS NOT NULL, t2.Header2, t1.Header2 ) AS Header2,
            IIF( ( t1.Header3 IS NULL OR LEN(t1.Header3) = 0 ) AND t2.Header3 IS NOT NULL, t2.Header3, t1.Header3 ) AS Header3
        FROM
            table1 AS t1
            LEFT OUTER JOIN table2 AS t2 ON t1.ID = t2.ID
    
        UNION

        SELECT
            t2.ID,
            IIF( ( t2.Header1 IS NULL OR LEN(t2.Header1) = 0 ) AND t1.Header1 IS NOT NULL, t1.Header1, t2.Header1 ) AS Header1,
            IIF( ( t2.Header2 IS NULL OR LEN(t2.Header2) = 0 ) AND t1.Header2 IS NOT NULL, t1.Header2, t2.Header2 ) AS Header2,
            IIF( ( t2.Header3 IS NULL OR LEN(t2.Header3) = 0 ) AND t1.Header3 IS NOT NULL, t1.Header3, t2.Header3 ) AS Header3
        FROM
            table2 AS t2
            LEFT OUTER JOIN table1 AS t1 ON t1.ID = t2.ID
    ) AS u

【讨论】:

  • IIF 是否在 Access SQL 中工作?并且两个表的 ID(主键)完全相同
  • @user15068397 IIF 在 Access 自身内部以及通过 JET 和 ACE 在 OLE-DB 和 ODBC 中均受 Access SQL 支持。
  • @user15068397 我的回答也不支持多值字段。您应该先将表格更改为使用多值字段。
  • OUTER JOIN 不受 Access SQL 支持。
  • @Harun24HR Blast!我诅咒微软决定让 Access 的 SQL 功能停滞 21 年的那一天跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2018-01-16
  • 2021-09-09
  • 1970-01-01
  • 2016-03-23
  • 2020-12-14
相关资源
最近更新 更多