為什麼 COALESCE 函式不適用於此查詢?
我正在嘗試計算從子查詢中檢索到的列數,並且某些子查詢可能為空。因此,我不想將其顯示為空單元格,而是希望它為 0。發現我可以通過使用該
COALESCE
函式來做到這一點,但是例如這個查詢仍然給了我一個空單元格:CREATE VIEW third_table AS SELECT * FROM (second_table NATURAL FULL JOIN ( SELECT assignment_id, COALESCE( count(*), 0 ) AS num_60_79 FROM ( SELECT assignment_id, mark_as_percent FROM avg_required_table WHERE mark_as_percent >= 60 AND mark_as_percent < 80 ) a GROUP BY assignment_id ) b);
這
COALESCE
是應該如何使用的嗎?
回答你的問題
COALESCE
你把它放在哪裡開始是***完全沒有意義的。***聚合函式count()
從不返回 NULL。並且邏輯規定num_60_79
在子查詢中永遠不能低於 1。有關的:但這無關緊要,因為如果子查詢不返回任何行,則它根本無法返回任何值。
準確地說,在您的情況下,子查詢可能會返回任意數量的行,但是,當加入 時
second_table
,如果沒有匹配值的行,(assignment_id, num_60_79)
則子查詢中的所有列b
都將填充 NULL 值。有關的:
NATURAL FULL JOIN
是一種非常奇特的連接表格的方式。特別是對於仍在學習如何使用的人COALESCE
。引用手冊:
NATURAL``USING
是提及兩個表中具有相同名稱的所有列的列表的簡寫。和:
FULL OUTER JOIN
返回所有連接的行,加上每個不匹配的左側行(右側以空值擴展)的一行,以及每個不匹配的右側行(左側以空值擴展)的一行。我認為可以安全地假設其中沒有列命名
num_60_79
,second_table
並且如果有的話,您肯定不想將其包含在連接條件中。您只想加入 columnassignment_id
,這就是您應該在查詢中而不是NATURAL
關鍵字中輸入的內容。此外,雖然在這裡
FULL JOIN
理論上是可能的,但我們通常會看到一個LEFT JOIN
.您也不需要兩層子查詢和查詢中的一些其他噪音。
正確查詢
考慮到所有的事情,當你…
試圖計算從子查詢中檢索到的列數
…我有根據的猜測是你想要這個查詢:
SELECT s.*, COALESCE(b.num_60_79, 0) AS num_60_79 FROM second_table s LEFT JOIN ( SELECT assignment_id, count(*) AS num_60_79 FROM avg_required_table WHERE mark_as_percent >= 60 AND mark_as_percent < 80 GROUP BY assignment_id ) b USING (assignment_id);