如何基于一列连接两个表,除非它为null,在这种情况下基于两个不同的列进行连接

时间:2015-11-30 20:04:03

标签: mysql sql join

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

string backupPath = Path.GetFileNameWithoutExtension(filePath) + ".bak";
File.Delete(backupPath);
File.Move(filePath, backupPath);

*这些表格是为了便于理解而组织的,但实际上并不存在

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

我用谷歌搜索得到的是

 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

我试图弹出的结果只是横向合并上面的表格:

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

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

这里的主要困难是我不确定如何设置逻辑,

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

进入SQL

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你可以对第二张表进行双左连接并应用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别名。