【问题标题】:How do you join two tables based on one column unless it's null, in which case join based on two different columns除非它为空,否则如何基于一列连接两个表,在这种情况下,基于两个不同的列连接
【发布时间】:2016-03-04 14:00:31
【问题描述】:

所以这很令人困惑,但让我们从下表开始:

 Table1           Table2
 ID1  |  ID2  ||  ID1  |  ID2
 -----------  ||  -----------
 jve  |  234  ||  jve  |  null
 null |  234  ||  dav  |  234
 rev  |  584  ||  rev  |  null
 null |  584  ||  ewj  |  584
 avv  |  442  ||  avv  |  null
 null |  442  ||  pol  |  442

*这些表格是为了便于理解而组织的,但实际上并非如此

我要做的是在 T1.ID1 = T2.ID1 上加入 Table1 和 Table2。但是,如果 ID1 恰好为空,那么我想在 T1.ID2 = T2.ID2 上加入它们,而不是第一种方式。

我用谷歌搜索得到的是

SELECT *
  FROM table1 t1
       INNER JOIN table2 t2
          ON (    t1.ID1 = COALESCE (t2.ID1, t1.ID1)
              AND t1.ID2 = COALESCE (t2.ID2, t1.ID2))
 WHERE ID2 = '234';

我试图弹出的结果只是水平合并上述表格:

Results
-------
jve  | 234 | jve | null
null | 234 | dav | 234
etc..

原因是除了 ID2 之外还有更多列我试图在表 1 和表 2 之间对齐。

这里的主要问题是我不知道如何表达逻辑,

if( T1.ID1 == null )
{
   ON T1.ID2 = T2.ID2
}
else
{
   ON T1.ID1 = T2.ID1
}

进入 SQL

如果需要更多信息,我很乐意添加到我的帖子中。

我忘了包括如果它加入第一种方式,它不应该加入第二种方式。我的意思是,第一行,jve | 234应该加入jve | null 然后是下一行,null |应该抢234而不是加入jve | 天天要闻234 到 dav | 234...如果这有任何意义..

我需要使用一种方法或另一种方法来连接这两个表,但永远不要同时使用这两种方法。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    您的逻辑听起来像是ON 子句中的OR 条件:

    SELECT *
    FROM table1 t1 INNER JOIN
         table2 t2
         ON t1.ID1 = t2.ID1 OR
            (t1.ID1 IS NULL AND t1.ID2 = t2.ID2)
    WHERE t1.ID2 = '234';
    

    【讨论】:

      【解决方案2】:

      您可以对第二个表进行双左连接并应用 COALESCE,使其类似于

      SELECT 
            t1.ID1,
            t1.ID2,
            COALESCE( t2a.ID1, t2b.ID1 ) as T2ID1,
            COALESCE( t2a.ID2, t2b.ID2 ) as T2ID2   
         FROM 
            table1 t1
               LEFT JOIN table2 t2a
                  ON t1.ID1 = t2a.ID1
                 AND NOT t1.ID1 IS NULL
               LEFT JOIN table2 t2b
                  ON t1.ID2 = t2b.ID2
                 AND t1.ID1 IS NULL
         WHERE 
            t1.ID2 = '234'
      

      因此,如果第一个表 T2A 有记录,它会分别从该行中提取值。如果为 null,则转到字段的 T2B 别名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        相关资源
        最近更新 更多