Table A
Symbol_A Time_A Val_A
00001 2012/12 4
00001 2011/12 4
00001 2010/12 4
00001 2009/12 4
00001 2008/12 4
00001 2012/06 2
00001 2011/06 2 Table B
Symbol_B Time_B Val_B
00001 2012/12 4
00001 2011/11 4
00001 2010/12 2
00001 2009/08 4
00001 2008/12 4
00001 2012/06 4
00001 2011/05 2有两张表,分别是 Table A 和 Table B,以上是示例数据Symbol_A Time_A Val_A Symbol_B Time_B Val_B
00001 2012/12 4 00001 2012/12 4
00001 2011/05 2 NULL NULL NULL
NULL NULL NULL 00001 2011/11 4
00001 2010/12 4 NULL NULL NULL
NULL NULL NULL 00001 2010/12 2
00001 2009/12 4 NULL NULL NULL
NULL NULL NULL 00001 2009/08 4
00001 2008/12 4 00001 2008/12 4
00001 2012/06 2 NULL NULL NULL
NULL NULL NULL 00001 2012/06 4
00001 2011/06 2 NULL NULL NULL
NULL NULL NULL 00001 2011/05 2以上是我想要实现的查询效果,就是Symbol_A=Symbol_B、Time_A=Time_B、Val_A=Val_B 时就显示为一行,否则就是Symbol_A 、Time_A、Val_A或者Symbol_B、Time_B、Val_B另起一行,对应没有的就为空,要求用一句MYSQL实现,谢谢!
a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
UNION ALL
SELECT * FROM tta a RIGHT JOIN ttb b ON
a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
WHERE a.Symbol_A IS NULL
union
select A.*,B.* from A right join B on A.symbol_A=B.symbol_B and A.time_A=B.time_B and A.val_A=B.Val_B
这样是可以了,但是请问如果有C表的话怎么UNION呢?
-> a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
-> UNION ALL
-> SELECT * FROM tta a RIGHT JOIN ttb b ON
-> a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
-> WHERE a.Symbol_A IS NULL;
+----------+---------+-------+----------+---------+-------+
| Symbol_A | Time_A | Val_A | Symbol_B | Time_B | Val_B |
+----------+---------+-------+----------+---------+-------+
| 00001 | 2012/12 | 4 | 00001 | 2012/12 | 4 |
| 00001 | 2011/12 | 4 | NULL | NULL | NULL |
| 00001 | 2010/12 | 4 | NULL | NULL | NULL |
| 00001 | 2009/12 | 4 | NULL | NULL | NULL |
| 00001 | 2008/12 | 4 | 00001 | 2008/12 | 4 |
| 00001 | 2012/06 | 2 | NULL | NULL | NULL |
| 00001 | 2011/06 | 2 | NULL | NULL | NULL |
| NULL | NULL | NULL | 00001 | 2011/11 | 4 |
| NULL | NULL | NULL | 00001 | 2010/12 | 2 |
| NULL | NULL | NULL | 00001 | 2009/08 | 4 |
| NULL | NULL | NULL | 00001 | 2012/06 | 4 |
| NULL | NULL | NULL | 00001 | 2011/05 | 2 |
+----------+---------+-------+----------+---------+-------+
12 rows in set (0.00 sec)mysql>
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
C表要求就是要满足A B C三表的Symbol、Time、Val字段相同时就列出一行,这一行包括C表的三个字段,否则就另起一行,与上面两表的要求一样。Symbol_A | Time_A | Val_A | Symbol_B | Time_B | Val_B | Symbol_C | Time_C | Val_C就像这样
A、C不同
A、B不同
B、C不同
要考虑3种情况
是的,要怎么实现呢,并且ABC三表的字段都列成一行哦
SELECT * FROM tta a LEFT JOIN ttb b ON
a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
LEFT JOIN ttc c ON
a.Symbol_A=c.Symbol_B AND a.Time_A=c.Time_B AND a.Val_A=c.Val_B
UNION
SELECT *,'','','' FROM tta a RIGHT JOIN ttb b ON
a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
UNION
SELECT *,'','','' FROM tta a RIGHT JOIN ttc b ON
a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
UNION
SELECT *,'','','' FROM ttb a RIGHT JOIN ttc b ON
a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_BUNION
SELECT *,'','','' FROM ttc a RIGHT JOIN ttb b ON
a.Symbol_A=b.Symbol_B AND a.Time_A=b.Time_B AND a.Val_A=b.Val_B
思路:
相同的简单,不同的是指:
A、B相同,C不同
A、C相同,B不同
C、B相同,A不同
A有B、C没有
B有A、C没有
C有A、B没有比较麻烦