我试图完成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桌全外连接吗?我有什么组合缺失吗? 不幸的是,由于我不允许,我无法发布表格或提供过多的规范。我也无法自己改变表格,我基本上只有只读授权。
答案 0 :(得分:0)
您可以使用union
和left 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(也是免费的)数据库。