SQL连接简单问题

时间:2011-02-15 18:17:28

标签: sql join

这是一个简单的SQL JOIN问题,我的解决方案在尝试使用示例数据时有效,但是当我对大量数据执行相同操作时,它会失败。

我有两张桌子 的 TBL1

a   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 中的值在表中都是唯一的。

3 个答案:

答案 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值的记录。

<小时/> 编辑:根据OP的请求,此处等同于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