【问题标题】:Eliminate common rows from two tables - MS Access消除两个表中的共同行 - MS Access
【发布时间】:2017-09-02 22:32:06
【问题描述】:

我有两个结构相同的表:

'NCC Code' - Integer
'Vendor' - Short Text
'Profit Center' - Short Text
'Business Franchise' - Short Text
'Business Division' - Short Text
'Spend' - Float
'Savings' - Float

这些表格包含来自两个不同来源的不同数据集。两者都有一些行相同,但大多数行不同。所有行的差异都不相同,不在同一列中(例如:某些记录可能因“Business Franchise”而异,而所有其他列相同,其他因“Savings”而异,而其他记录可能不止一列)。

每个表都没有唯一的值或键,因为它们是从 DWH 系统生成的。

就软件工具而言,我只能使用 MS Access 2013 和 MS Excel 2013。

我需要找到一种方法来识别和提取一个表中的所有行,而这些行在另一个表中是找不到的。谁能给我一个关于如何做的建议?我尝试了各种方法,但无济于事。

谢谢!

【问题讨论】:

  • Access 支持左连接。将所有列从 A 连接到所有列 B。然后仅显示 B 为 NULL 的那些。这将为您提供 A 中而不是 B 中的所有记录。
  • 谢谢。此连接会将 A 的整行与 B 的整行进行比较,以确定是否存在重复?
  • 是的,但是联合都可以与聚合一起工作......

标签: sql excel ms-access duplicates


【解决方案1】:

使用 LEFT JOIN(仅显示 A 而不是 b,但您可以切换表顺序并将结果合并以获得两者)

SELECT * 
FROM A
LEFT JOIN B
 on A.Col1=B.Col1
and A.Col2=B.Col2
and A.Col3=B.Col3
and A.col4=B.Col4...
WHERE B.Col1 is null
UNION ALL
SELECT * 
FROM B
LEFT JOIN A
 on A.Col1=B.Col1
and A.Col2=B.Col2
and A.Col3=B.Col3
and A.col4=B.Col4...
WHERE B.Col1 is null

使用 UNION ALL 和 AGGREGATE :这将显示来自任一表而不是另一个表的记录(A 不在 B 中,B 不在 A 中)联合所有不区分重复项(联合不区分)我们然后排除出现超过 1 次的记录。这假设每个表都没有任何重复项。如果他们这样做,我们可以在联合所有人之前将其设为 Distinct for table。

然后聚合

SELECT <All Columns less src), max(src) as SrcTable, cnt(1)
FROM (SELECT A.*, 'A' as src
     FROM A
     UNION ALL 
     SELECT B.*, 'B' as src
     FROM B ) C
GROUP BY <All Columns less src>
HAVING count(1) < 2

我添加了 src 以便我们知道记录来自哪个表。 max(src) 有效,因为记录只存在于一个地方。我们排除了两者中的那些。

【讨论】:

    【解决方案2】:

    我做到了,我想发布这个,因为可能还有其他人遇到同样的问题。似乎 MS Access 对括号非常严格。如果要运行连接查询并且其中一个条件包含字符串字段,则应将所有条件放在括号之间,如下所示:

    SELECT * 
    FROM A
    LEFT JOIN B
     on (A.Col1=B.Col1)
    and (A.Col2=B.Col2)
    and (A.Col3=B.Col3)
    and (A.col4=B.Col4)...
    WHERE B.Col1 is null
    UNION ALL
    SELECT * 
    FROM B
    LEFT JOIN A
     on (A.Col1=B.Col1)
    and (A.Col2=B.Col2)
    and (A.Col3=B.Col3)
    and (A.col4=B.Col4)...
    WHERE B.Col1 is null
    

    如果我将后面的所有内容放在一组括号之间,对我来说也有效:

    SELECT * 
    FROM A
    LEFT JOIN B
     (on A.Col1=B.Col1
    and A.Col2=B.Col2
    and A.Col3=B.Col3
    and A.col4=B.Col4...)
    WHERE B.Col1 is null
    

    这里有一些额外的信息: https://social.msdn.microsoft.com/Forums/office/en-US/15c36745-f7a4-4926-9687-7161e5894468/join-expression-not-supported-error-caused-by-unbracketed-join-expression-comprising-string?forum=accessdev

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      相关资源
      最近更新 更多