本文介紹了左聯接的行為與MySQL中的空值不同的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在從HackerRank完成this challenge。
它會問:
透視職業中的職業列,以便每個名稱按字母順序排序,并顯示在其對應的職業下。輸出列標題應分別為博士、教授、歌手和演員。
它涉及以下數據表:
Name Occupation
Ashley Professor
Samantha Actor
Julia Doctor
Britney Professor
Maria Professor
Meera Professor
Priya Doctor
Priyanka Professor
Jennifer Actor
Ketty Actor
Belvet Professor
Naomi Professor
Jane Singer
Jenny Singer
Kristeen Singer
Christeen Singer
Eve Actor
Aamina Doctor
我們希望按Occupation
透視此表,以便每個名稱按字母順序排序并顯示在其對應的職業下。輸出列標題(實際上不是)應該分別是Doctor、Offer、Singer和Actor。
但是,當我運行此MySQL代碼時:
SELECT d.name, p.name, s.name, a.name
FROM (
SELECT @row_number:=@row_number+1 AS row_number, Name
FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
WHERE Occupation = 'Professor'
ORDER BY Name
) p
LEFT JOIN (
SELECT @row_number:=@row_number+1 AS row_number, Name
FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
WHERE Occupation = 'Doctor'
ORDER BY Name
) d ON d.row_number =p.row_number
LEFT JOIN (
SELECT @row_number:=@row_number+1 AS row_number, Name
FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
WHERE Occupation = 'Singer'
ORDER BY Name
) s ON p.row_number =s.row_number
LEFT JOIN (
SELECT @row_number:=@row_number+1 AS row_number, Name
FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
WHERE Occupation = 'Actor'
ORDER BY Name
) a ON p.row_number =a.row_number
LEFT JOIN
%s的行為不符合預期,我收到:
NULL Ashley NULL NULL
NULL Belvet NULL NULL
NULL Britney NULL NULL
NULL Maria NULL NULL
NULL Meera NULL NULL
NULL Naomi NULL NULL
NULL Priyanka NULL NULL
這對我來說沒有意義–為什么連接會生成這么多空值?MySQL的行為方式是否使您不能對多個表進行編號?我不清楚。
推薦答案
我認為它沒有以您認為的方式匹配的原因是@row_number
沒有為每個子查詢重置為1。
我測試了它,只是加入了前兩個(教授和醫生),但使用了交叉連接,這樣我就可以看到所有的ROW_NUMBER值。
+------------+--------+------------+----------+
| row_number | name | row_number | name |
+------------+--------+------------+----------+
| 8 | Aamina | 1 | Ashley |
| 8 | Aamina | 2 | Belvet |
| 8 | Aamina | 3 | Britney |
| 8 | Aamina | 4 | Maria |
| 8 | Aamina | 5 | Meera |
| 8 | Aamina | 6 | Naomi |
| 8 | Aamina | 7 | Priyanka |
| 9 | Julia | 1 | Ashley |
| 9 | Julia | 2 | Belvet |
| 9 | Julia | 3 | Britney |
| 9 | Julia | 4 | Maria |
| 9 | Julia | 5 | Meera |
| 9 | Julia | 6 | Naomi |
| 9 | Julia | 7 | Priyanka |
| 10 | Priya | 1 | Ashley |
| 10 | Priya | 2 | Belvet |
| 10 | Priya | 3 | Britney |
| 10 | Priya | 4 | Maria |
| 10 | Priya | 5 | Meera |
| 10 | Priya | 6 | Naomi |
| 10 | Priya | 7 | Priyanka |
+------------+--------+------------+----------+
您可以看到,行號顯然是遞增的,并且在對行進行編號時,兩個子查詢中的初始值1已經完成。
您或許能夠通過在每個子查詢中使用不同的用戶變量來修復此問題。
但此查詢無論如何都不會以您希望的方式工作,例如,如果您的教授比其他職業的成員少。
老實說,我不會在SQL中進行這種列格式設置。只需執行四個獨立的查詢,將所有結果提取到您的應用程序中,并在輸出時將其格式化為列。這樣會簡單得多,簡單的代碼更容易編寫、更容易調試、更容易維護。
請回復您的評論:
很公平,只要您(和其他讀者)知道在實際項目中,編寫過于巧妙的SQL并不總是最好的主意,那么將其作為編碼挑戰是可以接受的。
因為您正在進行編碼挑戰,所以您應該自己解決它,所以我不能給您提供產生以下輸出的解決方案。但這證明了這是可能的(我保證我沒有模擬輸出,我真的從我的終端窗口復制和粘貼了它)。祝你好運!
+------------+-----------+--------+-----------+----------+
| row_number | Professor | Doctor | Singer | Actor |
+------------+-----------+--------+-----------+----------+
| 1 | Ashley | Aamina | Christeen | Eve |
| 2 | Belvet | Julia | Jane | Jennifer |
| 3 | Britney | Priya | Jenny | Ketty |
| 4 | Maria | NULL | Kristeen | Samantha |
| 5 | Meera | NULL | NULL | NULL |
| 6 | Naomi | NULL | NULL | NULL |
| 7 | Priyanka | NULL | NULL | NULL |
+------------+-----------+--------+-----------+----------+
這篇關于左聯接的行為與MySQL中的空值不同的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,