记录三个表中的差异 - MS Access

时间:2013-02-27 23:07:14

标签: sql ms-access

我有三个表Tab1Tab2Tab3几乎相同的结构(在MS Access中)。但Tab2Tab3列的列数多于Tab1

Tab2Tab3结构完全相同。以下是加入密钥

col1
col2
col3

基本上Tab1条记录应该与Tab2Tab3一致。 如果我需要在Tab2Tab3中与Tab1进行比较时获取丢失的记录,这可能是有效的方法

感谢您的回复

2 个答案:

答案 0 :(得分:0)

如果您只关心按键,这是一个很好的方法:

select col1, sum(isTab1) as numTab1, sum(isTab2) as numTab2, sum(isTab3) as numTab3
from ((select col1 as col, 1 as isTab1, 0 as isTab2, 0 as isTab3 from tab1
      ) union all
      (select col2, 0 as isTab1, 1 as isTab2, 0 as isTab3 from tab2
      ) union all
      (select col3, 0 as isTab1, 0 as isTab2, 1 as isTab3 from tab3
      )
     ) t
group by col
having sum(isTab1)*sum(isTab2)*sum(isTab3) <> 1

对于不在所有三个表中的键,它返回每个键值并告诉您它们在哪些表中而不在哪些表中。作为奖励,这也将告诉您是否有任何表有重复的密钥。

答案 1 :(得分:0)

通常你会选择从Tab1 LEFT加入tab2和tab3 LEFT JOINed在一起。这样你就可以从tab1获得所有记录。当tab2和tab3中有一些丢失的记录时,将出现空值。您可以在WHERE子句中检查空值

因此,查询看起来与此类似(请注意括号 - 这是ms访问的要求):

SELECT * FROM
tab1 LEFT JOIN (tab2 LEFT JOIN tab3 ON tab2.col1 = tab3.col1 AND tab2.col2 = tab3.col2)
ON tab1.col1 = tab2.col1 AND tab1.col2 = tab2.col2 
WHERE tab2.col1 Is Null;