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实现,谢谢!

解决方案 »

  1.   

    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
    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
      

  2.   

    select A.*,B.* from A lefe join B on A.symbol_A=B.symbol_B and A.time_A=B.time_B and A.val_A=B.Val_B
    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
      

  3.   


    这样是可以了,但是请问如果有C表的话怎么UNION呢?
      

  4.   

    mysql> 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
        ->  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>
      

  5.   

    MYSQL不支持FULL JOIN,有C表要求结果是什么
      

  6.   

    难度不是在写SQL语句或存储过程上。 难度主要是在楼主如何准确让别人理解自己的问题。   建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式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)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
      

  7.   


    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就像这样 
      

  8.   

    相同的简单,不同的是指:
    A、C不同
    A、B不同
    B、C不同
    要考虑3种情况
      

  9.   


    是的,要怎么实现呢,并且ABC三表的字段都列成一行哦
      

  10.   

    假设每表只有3个字段,显示格式自行调整
    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
      

  11.   

    看到这帖子就烦,一点诚意都没有,连个create和insert语句都不提供。
      

  12.   

    没有错
    思路:
    相同的简单,不同的是指:
    A、B相同,C不同
    A、C相同,B不同
    C、B相同,A不同
     A有B、C没有
     B有A、C没有
     C有A、B没有比较麻烦