[英]MySQL Self Full Outer 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
查詢:
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無法進行完全外部聯接,因此使用左,右或普通舊聯接將為我提供MINIMUM行,即,如果id缺少任何colA值,則結果將完全丟失它們,的確,如果我在上述任何ID中刪除q1和q2,則會得到一行。
q3 0.7 1.3 0.1
我已經看到了很多關於如何使用UNION / UNION ALL來模擬完全外部聯接的鏈接,我可以用科學怪人的身份進行鏈接,但是這些鏈接沒有給我帶來很好的比較表結果。 沒有一種更簡單的方法可以在SELF連接期間告訴查詢不忽略空值嗎? 我覺得這應該很容易,但是已經花了好幾個小時不停地抓着頭,用谷歌搜索了這么多答案,因為所有樹木,我都看不到木頭。
我會采取另一種方法; 避免完全外部聯接和自我聯接。
我認為您所追求的是在mySQL中模擬一個樞軸,該樞軸可以使用case語句和具有正確group by的聚合來完成。
演示: 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 |
+----+------+-----+-----+------+
假設
這將根據需要處理空值,因為只有空值的列的max為空,我們也可以coalesce()
結果以顯示0(如果優先於空值)。 例如: 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 |
+----+------+-----+-----+-----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.