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    

完全外部結合を使用してみましたが、期待される結果が表示されません。何か案は?

4

2 に答える 2

0

B/C個別の組み合わせの事前クエリを実行する方がかなり単純化されると思いますD/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と同じ

于 2013-02-08T02:37:08.883 に答える
0

とに参加ColumnBする必要があると仮定すると、上記の結果を得るにはいくつかのオプションがあります (これらが意図した結果であると仮定します)。 ColumnFColumnCColumnG

1 つのオプションは、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があります。

別のオプションは COALESCE、 andを使用することFULL 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

どちらも同じ結果になるはずです。

- 編集

望ましい結果が出力から 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

幸運を。

于 2013-02-08T01:50:10.203 に答える