2014-07-11 36 views
2

我學會了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 
+0

你試過了嗎?你怎麼看 ? –

回答

4

快速搜索網頁的顯示,模擬完全外部的主題JOIN(「FOJ」)在堆棧溢出或其他地方已經討論過很多次,但答案似乎都限制自己的情況只有兩張桌子。我懷疑這是因爲三個或多個表FOJ是

  1. 不是一個很普遍的現象,並
  2. 可能相當混亂。

不過,我想我給它一個去,這裏就是我想出了:

用於模擬FOJ最常提到的技術對兩個表是UNION ALL三種可能的情況下, :

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

或,用真= 1,假= 0

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

這看起來像一個二位整數有三個POSS IBLE非零值,並且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 

我創建了一個名爲[foj12]訪問已保存的查詢執行之間的FOJ [表1]和[表2]

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 

然後,我開始通過涉及案件[表3]工作。它們如下所示,並對應於下面的SQL語句中的「聯合」查詢。

  1. 表3同時匹配表1和表2(N = 7)
  2. 表3匹配表1但不表2(N = 5)
  3. 表3匹配表2,但不表1(N = 6)
  4. 行中表3中不表1表2或任何相匹配(N = 4)
  5. 行中FOJ(表1,表2)有什麼共同點與表3(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 

(不用說,我沒興趣增加了第四個表! :)

評論歡迎。

+1

哦,天啊...... +1 – Brad

+0

給我一點時間,看看我是否可以複製你的結果。儘管我非常欣賞這個努力! 我也發現了和你一樣的東西,幾乎每個例子都是爲了兩張表。讓我考慮重寫所有設置的代碼來編輯它,然後重寫數據庫。 – Jim

+0

我仍然在研究這個問題,我想我必須一起玩,因爲我的所有SQL代碼都駐留在ASP頁面中。我想我可以將前兩個表的FOJ保存爲字符串,並在需要時將其添加到查詢字符串中。 – Jim