我有两个具有相同结构的表,类似于:
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
不幸的是,我不会将这两个合并到我想要的结果中。我想它不是那么困难,但不知何故,我正在撞墙。
有什么想法吗?
答案 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