SQL中的多级/ IF语句JOIN?可能吗?

时间:2016-01-26 04:19:41

标签: mysql sql sql-server join

我会尽力解释问题并提供示例。

我有两个表(表A和表B),每个表都有三个可用于加入的键。我想执行连接,我想在多个级别执行连接。通过这个,我的意思是如果Key 1在两个表之间匹配,那么加入它。对于不匹配的剩余部分,使用密钥2加入,对于剩余的仍然不匹配,使用密钥3加入。 联接的层次结构顺序很重要。

示例数据:

        -----------------------------------------------
       | ------ TABLE A ------ | ------ TABLE B ------ |
       | KEY 1 | KEY 2 | KEY 3 | KEY 1 | KEY 2 | KEY 3 |
       |-------|-------|-------|-------|-------|-------|
 ROW 1 |  ABC  |  AAA  |  BBB  |  ABC  |  PPP  |  QRS  |
 ROW 2 |  DEF  |  RRR  |  NNN  |  XYZ  |  RRR  |  NMO  |
 ROW 3 |  HIJ  |  TTT  |  NNN  |  GHI  |  MMM  |  QQQ  |
 ROW 4 |  TUV  |  VVV  |  LLL  |  OPQ  |  UUU  |  LLL  |
 ROW 5 |  LMN  |  III  |  EEE  |  XYZ  |  III  |  JJJ  |
 ROW 6 |  PQR  |  CCC  |  OOO  |  WXY  |  HHH  |  DDD  |
        -----------------------------------------------

因此,如果我在Key 1上开始加入,只有第1行匹配,我完成了这一步。然后,我转到第2行,第2行和第5行将匹配。最后,我转到Key 3,只有第4行匹配。

所以我希望表A和表B的最终数据看起来像:

        -----------------------------------------------
       | ------ TABLE A ------ | ------ TABLE B ------ |
       | KEY 1 | KEY 2 | KEY 3 | KEY 1 | KEY 2 | KEY 3 |
       |-------|-------|-------|-------|-------|-------|
 ROW 1 |  ABC  |  AAA  |  BBB  |  ABC  |  PPP  |  QRS  | (Key 1)
 ROW 2 |  DEF  |  RRR  |  NNN  |  XYZ  |  RRR  |  NMO  | (Key 2)
 ROW 5 |  LMN  |  III  |  EEE  |  XYZ  |  III  |  JJJ  | (Key 2)
 ROW 4 |  TUV  |  VVV  |  LLL  |  OPQ  |  UUU  |  LLL  | (Key 3)
        -----------------------------------------------

我无法弄清楚如何在SQL的 ON 语句中添加条件以进行连接,或者我是否需要进行某种嵌套连接。

非常感谢你的帮助!

PS:示例表看起来像是以相同的顺序排序,但这只是为了便于理解。

2 个答案:

答案 0 :(得分:0)

UNION JOIN ON键1相等,JOIN ON键1不等于AND键2相等,JOIN ON键1不相等AND键2不等于AND键3相等。

答案 1 :(得分:0)

这样的东西会返回指定的结果:

SELECT a1.key1   AS a_key1
     , a1.key2   AS a_key2
     , a1.key3   AS a_key3
     , b1.key1   AS b_key1
     , b1.key2   AS b_key2
     , b1.key3   AS b_key3
     , '(key 1)' AS `match` 
  FROM tablea a1
  JOIN tableb b1
    ON b1.key1 =  a1.key1

 UNION ALL

SELECT a2.key1
     , a2.key2
     , a2.key3
     , b2.key1
     , b2.key2
     , b2.key3
     , '(key 2)' AS match 
  FROM tablea a2
  JOIN tableb b2
    ON b2.key1 <> a2.key1
   AND b1.key2 =  a2.key2

 UNION ALL

SELECT a3.key1
     , a3.key2
     , a3.key3
     , b3.key1
     , b3.key2
     , b3.key3
     , '(key 3)' AS match 
  FROM tablea a3
  JOIN tableb b3
    ON b3.key1 <> a3.key1
   AND b3.key2 <> a3.key2
   AND b3.key3 =  a3.key3