6

我希望基于参与连接的所有表中存在的一组列来连接两个(或更多)表。换句话说,我希望基于列的交集来连接表。但是,每个表都有额外的列,这些列对该表是唯一的。

交集

例子

# : 一个数字
- : 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 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

只是为了 a 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

这可能会有所帮助:

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

或者看看这里:

将两个表合并为一个输出

于 2012-06-12T19:50:54.407 回答
0

您可以使用联合解决双重外部联接:

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 回答
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 回答