对于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搜索了很多答案,我认为因为所有树木都不能看到木头。
答案 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 |
+----+------+-----+-----+------+
这假定
这会根据需要处理空值,因为只有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 |
+----+------+-----+-----+-----+