MySQL:匹配三个表中的列

时间:2015-11-11 03:16:36

标签: mysql join left-join

我有三张桌子。主键是PK列。我想在每个表上获得唯一的PK并根据PK填充NO列(参见下面的输出)。我怎么能用MySQL做到这一点?对不起我的问题,我刚认识MySQL,我只知道如何选择那些独特的PK。

--conf spark.yarn.executor.memoryOverhead=600

TABLE_A

 select U_IMSI from
 (select IMSI from table_A
 UNION
 select IMSI from table_B
 UNION
 select IMSI from table_C) as UNIQUE_IMSI 

表-B

PK     NO  
12345  22222
78912  33333
56892  44444

table_C

 PK     NO
 12345  88888
 78912  99999
 56892  11111

在table_C中注意:如果PK有1到3个值,则获取NO值并填充为C1 C2 C3。

输出

  PK    NO
  12345 NET
  78782 SMART
  12345 MMS
  12345 SMART
  56892 MMS
  78912 GT

1 个答案:

答案 0 :(得分:0)

这可能会让你走上正轨。

SELECT pk,
       a_no,
       c1,
       IF(c2 = c1,NULL,c2) c2,
       IF(c3 = c2,NULL,c3) c3,
       b_no
FROM(
  -- Separate the 3 table_C NO values into columns.
  SELECT pk, a_no,
         SUBSTRING_INDEX(c_no,',',-1) c1,
         SUBSTRING_INDEX( SUBSTRING_INDEX(c_no,',',-2),',',1 ) c2,
         SUBSTRING_INDEX( SUBSTRING_INDEX(c_no,',',-3),',',1 ) c3,
         b_no
  FROM (
    -- Condense to 1 row per PK, grouping the table_C NO values
    SELECT pk,
           MAX(a_no) a_no,
           MAX(b_no) b_no,
           GROUP_CONCAT(DISTINCT c_no) c_no
    FROM(
      -- Get the full outer join list of pks from:
      -- * PKS in table_A, table_B
      -- * PKS only in table_C
      SELECT a.pk, a.no a_no, b.no b_no, c.no c_no
      FROM   table_A a
      LEFT JOIN table_B b ON (a.pk = b.pk)
      LEFT JOIN table_C c ON (a.pk = c.pk)
      UNION
      SELECT c.pk, null, null, c.no
      FROM table_C c
    ) q
    GROUP BY pk
  ) q
) q
;