![](/img/trans.png)
[英]How to join two tables based on two columns and verifying that one column is existing in both
[英]How do you join two tables based on one column unless it's null, in which case join based on two different columns
因此,这令人困惑,但让我们从下表开始:
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..
这样做的原因是,我试图在ID1以外的表1和表2之间对齐的列还有更多。
这里主要的困难是我不确定如何表达逻辑,
if( T1.ID1 == null )
{
ON T1.ID2 = T2.ID2
}
else
{
ON T1.ID1 = T2.ID1
}
进入SQL
如果需要更多信息,我会很乐意添加到我的帖子中。
我忘了包括,如果它以第一种方式加入,那以后就不应该以第二种方式加入。 我的意思是第一行 234应该加入jve | null,然后下一行,null | 应该抓住234,而不是加入jve。 234至dav | 234 ...如果有任何道理..
我需要使用一个方法或另一个方法来连接这两个表,但绝不能同时使用这两个表。
您的逻辑听起来像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';
您可以对第二个表进行双左联接并应用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别名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.