合并表并删除重复项:使用Join,Union或两者

时间:2015-03-27 10:19:38

标签: sql postgresql

我有两个具有相同结构的表,类似于:

A:

gid, col
1, 23
2, 24
5, 63

B:

gid, col
1, 54
3, 223
5, 32

我希望有一个这样的合并表:

gid, colA, colB
1, 23, 54
2, 24, null
3, null, 223
5, 63, 32

不知怎的,我没有管理。我尝试了JOIN和UNION,但最好的结果就是接近:

JOIN:

SELECT A.gid, A.col, B.col FROM A LEFT OUTER JOIN B ON A.col=B.col

产生类似这样的东西(只是表A中的条目):

gid, colA, colB
1, 23, 54
2, 24, null
5, 63, 32

UNION:

select distinct(gid), a, b FROM(
 select A.gid , A.col as a, null as b from A UNION 
 select B.gid, null as a, B.col as b from B
)
as foo

仅获得此(重复条目):

gid, colA, colB
1, 23, null
1, null, 54
2, 24, null
3, null, 223
5, 63, null
5, null, 32

不幸的是,我不会将这两个合并到我想要的结果中。我想它不是那么困难,但不知何故,我正在撞墙。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

答案是FULL OUTER JOIN

PostgreSQL ,Oracle和SQL Server中,您可以使用以下语法:

SELECT A.gid, A.col, B.col FROM A FULL OUTER JOIN B ON A.gid = B.gid

MySQL不支持完全外连接,因此您必须使用具有两个连接的联合:

SELECT A.gid, A.col, B.col FROM A LEFT JOIN B ON A.gid = B.gid
UNION
SELECT B.gid, A.col, B.col FROM B LEFT JOIN A ON A.gid = B.gid

注意:此语法适用于大多数RDBMS,但如果连接列中存在重复项,则会提供与FULL OUTER JOIN不同的结果。

修改

这会处理已连接列中的重复项:

SELECT A.gid, A.col, B.col FROM A LEFT JOIN B ON A.gid = B.gid)
UNION ALL
SELECT B.gid, A.col, B.col FROM A RIGHT JOIN B ON A.gid = B.gid
  WHERE A.gid IS NULL

修改

OP的实际解决方案(来自下面的评论)

  

它与上面的mysql查询基本相同,但在每个表之前执行GROUP BY以删除每个表中的重复项。 注意:在我的情况下,可以,总结一下重复值。

SELECT
  t1.gid,
  t1.c,
  t2.c
FROM
  (SELECT gid, SUM(A.col) AS c FROM A GROUP BY gid) t1
  LEFT JOIN (SELECT gid, SUM(B.col) AS c FROM B GROUP BY gid) t2
    ON A.gid = B.gid

UNION

SELECT
  t2.gid,
  t1.c,
  t2.c
FROM
  (SELECT gid, SUM(B.col) AS c FROM B GROUP BY gid ) t2
  LEFT JOIN (SELECT gid, SUM(A.col) AS c FROM A GROUP BY gid) t1
    ON A.gid = B.gid

答案 1 :(得分:0)

使用完全外部联接设置查询,就像所有带有所有B表的表一样,并将null设置为不返回值

select a.gid, A.Col as colAn b.col as ColB 
    From A full outer join b on A.gid=b.gid