6

結合に参加するすべてのテーブルに存在する一連の列に基づいて、2 つ (またはそれ以上) のテーブルを結合したいと考えています。つまり、列の交差セットに基づいてテーブルを結合したいと考えています。ただし、各テーブルには、そのテーブルに固有の追加の列があります。

交差点セット

# : 数値
- : NULL

表 A

+------+------+------+
| Col1 | Col2 | ColA |
+------+------+------+
| A    | A    | #    |
| A    | B    | #    |
+------+------+------+

表 B

+------+------+------+
| Col1 | Col2 | ColB |
+------+------+------+
| A    | A    | #    |
| B    | B    | #    |
+------+------+------+

結果

+------+------+------+------+
| Col1 | Col2 | ColA | ColB |
+------+------+------+------+
| A    | A    | #    | #    |
| A    | B    | #    | -    |
| B    | B    | -    | #    |
+------+------+------+------+

私は解決策を思いつきましたが、パフォーマンスはひどいもので、パフォーマンスが問題です。そのソリューションであなたを汚染したくありません。私はむしろこれに新鮮な目を向けたいと思います:)

あなたの解決策を楽しみにしています。お時間をいただきありがとうございます。とても感謝しています。

アップデート

すべての応答に感謝します。しかし、私は問題を十分に説明していないようです。(まだすべての回答をテストしていません)

ただし、テーブル B には、テーブル A には存在しない行があることに注意してください。

Table B
+------+------+------+
| Col1 | Col2 | ColB |
+------+------+------+
| B    | B    | #    |
+------+------+------+

そしてテーブルAはその逆です。

私が思いついた解決策は、列の交差セットですべてのテーブルを結合してスケルトンを生成することです。

Skeleton:    
SELECT Col1, Col2 FROM TableA
UNION
SELECT Col1, Col2 FROM TableB

スケルトンを取得したら、各テーブルの LEFT OUTER JOIN を実行します。

LEFT OUTER JOIN TableA AS a ON a.Col1=skeleton.Col1 AND a.Col2=skeleton.Col2
LEFT OUTER JOIN TableB AS b ON b.Col1=skeleton.Col1 AND b.Col2=skeleton.Col2

したがって、最終的なクエリは次のようになります

SELECT s.*, a.ColA, b.ColB 
FROM 
(
    SELECT Col1, Col2
    FROM TableA
    UNION
    SELECT Col1, Col2
    FROM TableB
) s
LEFT OUTER JOIN TableA a ON a.Col1=s.Col1 AND a.Col2=s.Col2
LEFT OUTER JOIN TableB b ON b.Col1=s.Col1 AND b.Col2=s.Col2
4

4 に答える 4

3

だけのものfull outer join

select  coalesce(a.Col1, b.Col1) as Col1
.       coalesce(a.Col2, b.Col2) as Col2
,       a.ColA
,       b.ColB
from    A a
full outer join
        B b
on      a.Col1 = b.Col1
        and a.COl2 = b.Col2
于 2012-06-12T19:43:45.017 に答える
0

ああ、私の。あなたが気にかけていることを望みなさい。

-- Sample data.
declare  @TableA as Table ( Col1 VarChar(8), Col2 VarChar(8), ColA Int NULL )
insert into @TableA ( Col1, Col2, ColA ) values
  ( 'A', 'A', 42 ), ( 'A', 'B', 7 )
declare  @TableB as Table ( Col1 VarChar(8), Col2 VarChar(8), ColB Int NULL )
insert into @TableB ( Col1, Col2, ColB ) values
  ( 'A', 'A', 999 ), ( 'B', 'B', -1 )
select * from @TableA
select * from @TableB

-- The query.  Use the aggregate(s) of your choice: SUM, MIN, MAX, AVG.
select Col1, Col2, Sum( ColA ), Sum( ColB )
  from (
  select A.Col1, A.Col2, A.ColA, Cast( NULL as Int ) as [ColB]
    from @TableA as A
  union all
  select B.Col1, B.Col2, Cast( NULL as Int ), B.ColB
    from @TableB as B ) as Edgar
  group by Col1, Col2
于 2012-06-12T21:55:39.727 に答える
0

これは役立つかもしれません:

SELECT Col1, Col2, ColA
FROM A
GROUP BY Col1, Col2, ColA
UNION ALL
SELECT Col1, Col2, ColB
FROM B
GROUP BY ColB 

または、こちらをご覧ください:

2 つのテーブルを組み合わせて 1 つの出力にする

于 2012-06-12T19:50:54.407 に答える
0

Union を使用して二重外部結合を解決できます。

SELECT
  TableA.Col1,TableA.Col2,
  TableA.ColA,TableB.ColB
FROM TableA
LEFT JOIN TableB ON TableA.Col1=TableB.Col1 AND TableA.Col2=TableB.Col2

UNION

SELECT
  TableB.Col1,TableB.Col2,
  TableA.ColA,TableB.ColB
FROM TableB
LEFT JOIN TableA ON TableA.Col1=TableB.Col1 AND TableA.Col2=TableB.Col2
于 2012-06-12T19:52:06.243 に答える