这是一个简单的SQL JOIN问题,我的解决方案在尝试使用示例数据时有效,但是当我对大量数据执行相同操作时,它会失败。
我有两张桌子 的 TBL1a b
0 10
1 2
4 5
2 2
另一张表 tbl2
a c
1 22
2 18
10 9
98 8
现在我想要这样的决赛桌
a b c
0 10
1 2 22
2 2 18
4 5
10 9
98 8
我做的是:
1)temptbl = select a from tbl1 UNION select a from tbl2;
2)valueA = temptbl left join tbl1 on a
3)valueB = temptbl left join tbl2 on a
4)inner join valueA and ValueB on a
当我在本地尝试时,我的解决方案适用于小数据,但在服务器上运行时,左连接会生成一些随机数据(步骤1有效,但在步骤2之后,它不起作用)。有人可以帮我吗?我错了吗?还有其他解决方案
请注意,列 a 中的值在表中都是唯一的。
答案 0 :(得分:3)
你可以分成几部分:
-- Pick out records whose "a" values are in T1
SELECT T1.a, T1. b, T2.c
FROM T1
LEFT OUTER JOIN T2
ON T1.a=T2.a
UNION
-- Add records whose "a" values are NOT in T1
SELECT T2.a, NULL 'b', T2.c
FROM T2
WHERE NOT EXISTS (SELECT 1 FROM T1 WHERE T1.a = T2.a)
答案 1 :(得分:3)
你可能想要这样的东西:
SELECT coalesce(tbl1.a, tbl2.a) as a, /* one of them will be non-null */
tbl1.b,
tbl2.c
FROM tbl1 FULL OUTER JOIN tbl2
ON tbl1.a = tbl2.a
如果您的数据库不支持FULL JOIN
,则可以UNION
为每个表LEFT JOIN
加上LEFT JOIN
。只有tbl1在“左侧”的a
不会产生只有tbl2具有UNION
值的记录。
SELECT a,
b,
NULL as c
FROM tbl1
UNION
SELECT a,
NULL as b,
c
FROM tbl2
- 因为显然此数据库不支持@ DVK对反连接的良好建议:
{{1}}
答案 2 :(得分:0)
尝试类似
的内容SELECT all.a, b, c
FROM (SELECT DISTINCT a FROM tbl1 UNION SELECT a from tbl 2) all
LEFT OUTER JOIN tbl1 on tbl1.a = all.a
LEFT OUTER JOIN tbl2 on tbl2.a = all.a