我有两个具有相同结构的表:
'NCC Code' - Integer
'Vendor' - Short Text
'Profit Center' - Short Text
'Business Franchise' - Short Text
'Business Division' - Short Text
'Spend' - Float
'Savings' - Float
这些表包含来自两个不同来源的不同数据集。有些行在两者中都是相同的,但大多数都是不同的。所有行的差异并不相同,它们不在同一列中(例如:某些记录可能因“商业特许经营”而异,所有其他列都相同,其他列则为#39 ;储蓄'和其他人不止一列。)
每个表中没有唯一值或键,因为它们是从DWH系统生成的。
就软件工具而言,我只能访问MS Access 2013和MS Excel 2013。
我需要找到一种方法来识别和提取一个表中的所有行,这些行在另一个表中找不到。谁能给我一个如何做的建议呢?我尝试了各种方法,但无济于事。
谢谢!
答案 0 :(得分: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在B中不在A中)所有联合都没有区分出重复项(union不同)然后排除出现多于1次的记录。这假设每个表中都没有任何重复项。如果他们这样做,我们可以在联盟之前使它成为表的唯一。
然后汇总
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)起作用,因为记录只存在于一个地方。我们将两者排除在外。
答案 1 :(得分:1)
我做了,我想发布这个,因为可能有其他人遇到同样的问题。似乎MS Access对于paranthesis非常严格。如果要运行连接查询并且其中一个条件包含字符串字段,则应将所有条件置于paranthesis之间,如下所示:
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