MySQL自我全面加入

时间:2017-09-13 14:42:16

标签: mysql join self-join

对于SQL和MySQL,我非常高兴。我发现自我连接是一种比较“x”的方法,其中A列是相同的。

TAB1:

id    colA    x
-----------------
1     q1      0.1
1     q2      0.5
1     q3      0.7
2     q1      0.4
2     q2      0.9
2     q3      1.3
3     q1      0.2
3     q2      0.4
3     q3      0.1    

QUERY:

select a.`colA`, a.`x`, b.`x`, c.`x`
from `tab1` as a
join `tab1` as b on a.`colA` = b.`colA`
join `tab1` as c on a.`colA` = c.`colA`
where a.`id` = 1 and b.`id` = 2 and c.`id` = 3

给我:

colA    x      x      x
q1      0.1    0.4    0.2
q2      0.5    0.9    0.4
q3      0.7    1.3    0.1

辉煌!我还发现MySQL不具备完全外连接,因此使用left,right或plain old join会给我MINIMUM行,即如果id缺少任何colA值,那么它们将完全从结果中丢失事实上,如果我在上面的任何一个ID中拿走q1和q2,我会得到一行。

q3      0.7    1.3    0.1

我已经看到了很多关于如何使用UNION / UNION ALL来模拟完全外连接的链接,我可以坦率地说,但这些并没有给我一个很好的比较表的结果。是否有更简单的方法在SELF连接期间告诉查询不忽略空值?我觉得这应该很容易,但是我已经摸不着头几个小时了,并且用Google搜索了很多答案,我认为因为所有树木都不能看到木头。

1 个答案:

答案 0 :(得分:1)

我采取不同的方法;完全避免完全外连接和自连接。

我认为您之后正在模拟mySQL中的一个数据透视表,可以使用case语句和一个具有适当group by的聚合来完成。

DEMO:http://rextester.com/NGFNJG9485

SELECT ColA
     , max(Case when ID = 1 then x end) as x1
     , max(Case when ID = 2 then x end) as x2
     , max(Case when ID = 3 then x end) as x3
FROM tab1
GROUP BY colA

给我们:

+----+------+-----+-----+-----+
|    | ColA | x1  | x2  | x3  |
+----+------+-----+-----+-----+
|  1 | q1   | 0,1 | 0,4 | 0,2 |
|  2 | q2   | 0,5 | 0,9 | 0,4 |
|  3 | q3   | 0,7 | 1,3 | 0,1 |
+----+------+-----+-----+-----+

或者如果我们删除了ID 3的数据点,则colA' q2':

+----+------+-----+-----+------+
|    | ColA | x1  | x2  |  x3  |
+----+------+-----+-----+------+
|  1 | q1   | 0,1 | 0,4 | 0,2  |
|  2 | q2   | 0,5 | 0,9 | NULL |
|  3 | q3   | 0,7 | 1,3 | 0,1  |
+----+------+-----+-----+------+

这假定

  • 您将添加更多Q#,而不是更多ID。换句话说,我们不需要添加更多列,因为ID始终是1,2,3。如果确实需要更多列(Id),只需添加其他案例;或使用顶级评论第二链接中提到的动态SQL。
  • ID和colA是唯一的。如果存在重复,那么我们需要讨论应该呈现x的值。平均?和?什么?否则,min / max / avg都能正常工作。

这会根据需要处理空值,因为只有null的列的最大值为null我们也可以coalesce()结果显示0,如果优先于null。例如:coalesce(max(Case when ID = 3 then x end),0) as x3

给我们:

+----+------+-----+-----+-----+
|    | ColA | x1  | x2  | x3  |
+----+------+-----+-----+-----+
|  1 | q1   | 0,1 | 0,4 | 0,2 |
|  2 | q2   | 0,5 | 0,9 | 0,0 |
|  3 | q3   | 0,7 | 1,3 | 0,1 |
+----+------+-----+-----+-----+