【问题标题】:Simulate FULL OUTER JOIN with Access on more than two tables在两个以上的表上使用 Access 模拟 FULL OUTER JOIN
【发布时间】:2014-07-11 15:06:06
【问题描述】:

我学到了 Access 不允许您进行完全外部联接的艰难方式,并且在阅读如何模拟外部联接时,我已经开始了解如何做到这一点,但在尝试将其应用于不止只有两张桌子。

就这么简单吗?

SELECT * FROM table1
LEFT JOIN table2 ON table1.field = table2.field
LEFT JOIN table3 ON table1.field = table3.field
UNION
SELECT * FROM table1
RIGHT JOIN table2 ON table1.field = table2.field
RIGHT JOIN table3 ON table1.field = table3.field

【问题讨论】:

  • 你试过了吗?你怎么看?

标签: ms-access full-outer-join


【解决方案1】:

快速搜索网络发现,模拟 FULL OUTER JOIN(“FOJ”)的主题已经在 Stack Overflow 和其他地方讨论过很多次,但答案似乎都仅限于只有两个表的情况.我怀疑这是因为三张或更多桌子上的 FOJ 是

  1. 这种情况并不常见,而且
  2. 可能相当混乱。

不过,我想我会试一试,这就是我想出的:

在两个表上模拟 FOJ 最常提到的技术是将所有三种可能的情况联合起来:

In_Table2  In_Table1
---------  ---------
false      true
true       false
true       true

或者,替换为 true=1 和 false=0

In_Table2  In_Table1
---------  ---------
0          1
1          0
1          1

这看起来像一个具有三个可能的非零值的两位整数,提取这些值的 SQL 格式为

Table2 RIGHT JOIN Table1 WHERE Table2.something IS NULL
UNION ALL
Table2 LEFT JOIN Table1 WHERE Table1.something IS NULL
UNION ALL
Table2 INNER JOIN Table1

因此,具有三个表的情况的状态表看起来像一个具有七个可能的非零值的三位整数

In_Table3  In_Table2  In_Table1
---------  ---------  ---------
0          0          1
0          1          0
0          1          1
1          0          0
1          0          1
1          1          0
1          1          1

我想对一个整数值进行连接,所以我只是为七行中的每一行依次分配它们

Table3  Table2  Table1
------  ------  ------
                1
        2       
        3       3
4               
5               5
6       6       
7       7       7

所以我的测试表是

[表1]

n  txt 
-  ----
1  t1_1
3  t1_3
5  t1_5
7  t1_7

[表2]

n  txt 
-  ----
2  t2_2
3  t2_3
6  t2_6
7  t2_7

[表3]

n  txt 
-  ----
4  t3_4
5  t3_5
6  t3_6
7  t3_7

我在 Access 中创建了一个名为 [foj12] 的已保存查询来执行 [Table1] 和 [Table2] 之间的 FOJ

    SELECT t1.n AS t1_n, t1.txt AS t1_txt, t2.n AS t2_n, t2.txt AS t2_txt
    FROM
        Table1 t1
        INNER JOIN
        Table2 t2
            ON t1.n = t2.n
UNION ALL
    SELECT t1.n AS t1_n, t1.txt AS t1_txt, t2.n AS t2_n, t2.txt AS t2_txt
    FROM
        Table1 t1
        LEFT JOIN
        Table2 t2
            ON t1.n = t2.n
    WHERE t2.n IS NULL
UNION ALL 
    SELECT t1.n AS t1_n, t1.txt AS t1_txt, t2.n AS t2_n, t2.txt AS t2_txt
    FROM
        Table1 t1
        RIGHT JOIN
        Table2 t2
            ON t1.n = t2.n
    WHERE t1.n IS NULL

返回

t1_n  t1_txt  t2_n  t2_txt
----  ------  ----  ------
   1  t1_1                
                 2  t2_2  
   3  t1_3       3  t2_3  
   5  t1_5                
                 6  t2_6  
   7  t1_7       7  t2_7  

然后我开始处理涉及 [Table3] 的案例。它们如下所示,对应于下面 SQL 语句中的“联合”查询。

  1. Table3 同时匹配 Table1 和 Table2 (n=7)
  2. Table3 匹配 Table1 但不匹配 Table2 (n=5)
  3. Table3 匹配 Table2 但不匹配 Table1 (n=6)
  4. Table3 中与 Table1 或 Table2 中的任何内容都不匹配的行 (n=4)
  5. FOJ(Table1,Table2) 中与 Table3 没有任何共同之处的行 (n=1,2,3)
    SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, t3.n AS t3_n, t3.txt AS t3_txt
    FROM
        Table3 t3
        INNER JOIN
        foj12 f
            ON t3.n = f.t1_n AND t3.n = f.t2_n
UNION ALL
    SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, t3.n AS t3_n, t3.txt AS t3_txt
    FROM
        Table3 t3
        INNER JOIN
        foj12 f
            ON t3.n = f.t1_n
    WHERE f.t2_n IS NULL
UNION ALL
    SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, t3.n AS t3_n, t3.txt AS t3_txt
    FROM
        Table3 t3
        INNER JOIN
        foj12 f
            ON t3.n = f.t2_n
    WHERE f.t1_n IS NULL
UNION ALL
    SELECT NULL, NULL, NULL, NULL, t3.n AS t3_n, t3.txt AS t3_txt
    FROM
        Table3 t3
    WHERE t3.n NOT IN (SELECT t1_n FROM foj12 WHERE t1_n IS NOT NULL)
        AND t3.n NOT IN (SELECT t2_n FROM foj12 WHERE t2_n IS NOT NULL)
UNION ALL
    SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, NULL, NULL
    FROM foj12 f
    WHERE 
        (f.t1_n NOT IN (SELECT n FROM Table3) AND f.t2_n NOT IN (SELECT n FROM Table3))
        OR
        (f.t1_n NOT IN (SELECT n FROM Table3) AND f.t2_n IS NULL)
        OR
        (f.t1_n IS NULL AND f.t2_n NOT IN (SELECT n FROM Table3))
ORDER BY 5, 3, 1

那个小美女回来了

t1_n  t1_txt  t2_n  t2_txt  t3_n  t3_txt
----  ------  ----  ------  ----  ------
   1  t1_1                              
                 2  t2_2                
   3  t1_3       3  t2_3                
                               4  t3_4  
   5  t1_5                     5  t3_5  
                 6  t2_6       6  t3_6  
   7  t1_7       7  t2_7       7  t3_7  

(不用说我对添加第四个表不感兴趣!:)

欢迎评论。

【讨论】:

  • 给我一点时间看看我能不能复制你的结果。不过,我绝对感谢您的努力!我也发现了和你一样的东西,几乎每个例子都只针对两个表。让我考虑重写所有设置来编辑它的代码,然后重写数据库。
  • 我仍在处理这个问题,我想我必须尝试一下,因为我的所有 SQL 代码都驻留在 ASP 页面中。我想我可以将前两个表的 FOJ 保存为字符串,并在必要时将其添加到查询字符串中。
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2019-01-27
  • 2019-08-06
  • 1970-01-01
  • 2015-08-10
相关资源
最近更新 更多