【问题标题】:Multi-Level / IF-statement JOIN in SQL? Is it possible?SQL中的多级/ IF语句JOIN?可能吗?
【发布时间】:2016-05-02 14:41:22
【问题描述】:

我会尽力解释问题并举例说明。

我有两个表(表 A 和表 B),每个表都有三个可用于连接的键。我想在多个级别上执行连接,并且我想在多个级别上执行连接。我的意思是,如果 Key 1 在两个表之间匹配,则加入该表。剩下的不匹配,使用Key 2加入,剩下的仍然不匹配,使用Key 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  |
        -----------------------------------------------

因此,如果我在键 1 上开始加入,则只有第 1 行会匹配,并且我已完成此步骤。然后,我转到第 2 行和第 5 行将匹配的第 2 键。最后,我转到第 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:示例表看起来按照相同的顺序排序,但这只是为了便于理解。

【问题讨论】:

  • 请向我们展示您的表格定义。您是否尝试过查询?
  • 您可以将ANDON 一起使用,例如LEFT JOIN a ON a.key1 = b.key1 AND a.key2 != b.key2 AND a.key3 != b.key3,然后对每个键实例执行此操作。这有意义吗?
  • 你说你想按顺序进行 JOIN,你说后面的连接的输入和键是什么,但是结果与这些连接结果有什么关系?是他们的联合吗?。
  • mysql 还是 sql-server ? ,您已标记了 2 个不同的 dbms。

标签: mysql sql sql-server join


【解决方案1】:

联合 JOIN ON 键 1 相等,JOIN ON 键 1 不相等 AND 键 2 相等,JOIN ON 键 1 不相等 AND 键 2 不相等 AND 键 3 相等。

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2011-08-02
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多