2013-02-08 21 views
0
Table A     
Column A Column B Column C Column D    
1   AA   A1   B1   
2   BB   A2   B2   
3   CC   A3   B3   
4   DD   A4   B4   

Table - B      
Column E Column F Column G Column H    
1   AA   A1   1234    
2   BB   A2   2345    
3   EE   A3   6767    
4   FF   A4   5555    

Result Table [Joining on Column B and Column C with Column C and Column D that are not primary keys]  
Column B Column C Column D Column H    
AA   A1   B1   1234    
BB   A2   B2   2345    
CC   A3   B3   NULL    
DD   A4   B4   NULL    
EE   A3   NULL   6767    
FF   A4   NULL   5555  

我使用全外試圖加入,但沒有看到預期的結果。有任何想法嗎?連接表,並得到結果類似於完全外部的東西加入

+0

入世對列B和C是什麼? –

+0

預期結果是什麼,實際結果是什麼?你給了一個而不是另一個。 – hd1

回答

0

假設你需要加入ColumnBColumnFColumnCColumnG,你有兩個選擇去你的上述結果(假設這些都是您的預期結果)。

一個選項是使用UNION

SELECT A.ColumnB, A.ColumnC, A.ColumnD, B.ColumnH 
FROM TableA A 
    LEFT JOIN TableB B ON A.ColumnB = B.ColumnF AND A.ColumnC = B.ColumnG 
UNION 
SELECT B.ColumnF, B.ColumnG, NULL, B.ColumnH 
FROM TableB B 
    LEFT JOIN TableA A ON B.ColumnF = A.ColumnB AND A.ColumnC = B.ColumnG 
WHERE A.ColumnB IS NULL 

而這裏是SQL Fiddle

另一種選擇是使用COALESCEFULL OUTER JOIN

SELECT COALESCE(A.ColumnB,B.ColumnF), 
    COALESCE(A.ColumnC,B.ColumnG), A.ColumnD, B.ColumnH 
FROM TableA A 
    FULL OUTER JOIN TableB B ON A.ColumnB = B.ColumnF AND A.ColumnC = B.ColumnG 

而且更Fiddle

它們都應該產生相同的結果。

--edit

假設您想要的結果,以刪除輸出中的NULL值,那麼這樣的事情應該工作:

SELECT COALESCE(A.ColumnB,B.ColumnF), 
    COALESCE(A.ColumnC,B.ColumnG), 
    COALESCE(A.ColumnD,A2.ColumnD), 
    COALESCE(B.ColumnH,B2.ColumnH) 
FROM TableA A 
    FULL OUTER JOIN TableB B ON A.ColumnB = B.ColumnF AND A.ColumnC = B.ColumnG 
    LEFT JOIN TableA A2 ON B.ColumnG = A2.ColumnC 
    LEFT JOIN TableB B2 ON A.ColumnC = B2.ColumnG 

而更多的小提琴:http://sqlfiddle.com/#!4/32b3e/1

祝你好運。

0

我認爲這將是相當簡單做不同B/CD/F組合預先查詢......然後使用它作爲基礎,根據需要重新加入到table AB獲得額外列。像

select 
     PreQuery.Col1 as ColumnA, 
     PreQuery.Col2 as ColumnB, 
     A2.ColumnD, 
     B2.ColumnH 
    from 
     (select distinct 
       a.ColumnB as Col1, 
       a.ColumnC as Col2 
      from 
       TableA a 
     UNION 
     select 
       b.ColumnF as Col1, 
       b.ColumnG as Col2 
      from 
       TableB b) PreQuery 
     LEFT JOIN TableA A2 
     on PreQuery.Col1 = A2.ColumnB 
     AND PreQuery.Col2 = A2.ColumnC 
     LEFT JOIN TableB B2 
     on PreQuery.Col1 = B2.ColumnF 
     AND PreQuery.Col2 = B2.ColumnG 

的東西,如果你不真正想要的NULL顯示,使用

COALESCE(A2.ColumnD, "") 

同樣與ColumnH