MS Access - 3个表的完全外部连接

时间:2014-06-30 15:25:32

标签: sql database ms-access ms-access-2007

我试图完成3个表的完全外连接,并且从here

开始做两个表FOJ的逻辑

所以我没有在3个查询上做UNION(就像我用两个表一样),而是做了7个查询来进行联合。我确定效率非常低,但这是我第一次使用Access。

基本上,我有一张表格,其中包含有关实际花费的信息。有关他们花在什么上的规范(一个数字ID),谁提供了它们(一个数字代码),谁收到它们(一个不同的数字代码)。其他两个表具有相似的规范,但其中一个表示预测要花费的内容,另一个表示最初预算花费的内容。

我能够做两张桌子的FOJ并得到准确的数字,但我在做三向FOJ时遇到了麻烦。

在实际表格中,对于特定ID,提供商代码和接收者代码,可能会有3个记录的美元记录,而在预测表中,可能有2个,在预算表中, 1.基本上不保证对于数字ID,提供者代码,接收者代码的每个组合,三个表中的记录数量相同。

为了确保记录不会相乘,我单独查询了​​3个表并执行了Group By功能。我提出的7个查询如下:

表1:实际内部联接w / Forecast&内部联接w / B

表2: F内部联接w / B& F左外连接A(其中A为空)

表3: F内部联接w / A& F左外连接w / B(其中B为空)

表4: B内部联接w / A& B左外连接w / F(其中F为空)

表5:左外连接w / B(其中B为空)&左外连接w / F(其中F为空)

表6: B左外连接w / A(其中A为空)& B左外连接w / F(其中F为空)

表7: F左外连接w / B(其中B为空)& F左外连接w / A(其中A为空)

有人可以告诉我如何进行3桌全外连接吗?我有什么组合缺失吗? 不幸的是,由于我不允许,我无法发布表格或提供过多的规范。我也无法自己改变表格,我基本上只有只读授权。

1 个答案:

答案 0 :(得分:0)

您可以使用unionleft outer join的序列。我认为3会做,但你可能需要6.这是SQL的草图:

select *
from A left outer join B left outer join C
union
select *
from B left outer join C left outer join A
union
select *
from C left outer join A left outer join B;

您可能需要根据条件对其进行扩展:

select *
from A left outer join B left outer join C
union
select *
from B left outer join C left outer join A
union
select *
from C left outer join A left outer join B
union
select *
from A left outer join C left outer join B
union
select *
from B left outer join A left outer join C
union
select *
from C left outer join B left outer join A;

然而,这两者似乎都是非常糟糕的想法。相反,只需使用所有三个表中的ID创建一个临时表:

select id into ids
from A
union 
select id
from b
union
select id
from c;

然后使用left outer join

select *
from ids left join A left join B left join C;

或者,更好。升级到支持更强大的SQL功能的SQL Server Express(也是免费的)数据库。