Postgresql
Postgres 未在 array_agg 查詢中返回數據,如下所示
當特定圖書館中沒有書籍數據時,就會出現問題。考慮以下工作場景。
桌子
library
-------------------------------- | id | name | owner | -------------------------------- | 1 | ABC | A | | 2 | DEF | D | | 3 | GHI | G | --------------------------------
桌子
books
-------------------------------- | id | title | library | -------------------------------- | a | xxx | 1 | | b | yyy | 1 | | c | zzz | 2 | --------------------------------
現在,當我進行如下查詢時:
SELECT library.name, array_agg(b.title) AS book_list FROM library, (SELECT title FROM books WHERE books.library = :library_no) as b WHERE library.id = :library_no GROUP BY library.id
該查詢為庫 1 和 2 生成輸出,但不為庫 3 生成輸出。為什麼以及如何解決此問題?(在沒有圖書館書籍的情況下生成一個空列表)
所需輸出:
---------------------- | name | book_list | ---------------------- | GHI | {} | # or {null} -----------------------
我什至試過
coalesce
如下:SELECT library.name, coalesce(array_agg(b.title), ARRAY[]::VARCHAR[]) AS book_list FROM library, (SELECT title FROM books WHERE books.library = :library_no) as b WHERE library.id = :library_no GROUP BY library.id
Postgres 版本:12
A
LEFT JOIN
可以解決它,就像 Laurenz 提供的那樣。
LATERAL
但我建議在子查詢中使用 ARRAY 建構子:SELECT l.name, b.book_list FROM library l CROSS JOIN LATERAL ( SELECT ARRAY( SELECT title FROM books WHERE library = l.id ) ) b(book_list) WHERE l.id = :library_no;
這樣,您不需要在外部查詢級別進行聚合,也不需要在
GROUP BY
那裡。您也不需要
COALESCE
,因為空結果上的 ARRAY 建構子已經生成了一個空數組 ({}
)。並且對於一個小的選擇應該更快
library
- 顯然查詢會獲得單個給定庫的結果。除此之外,您只需要將變數
:library_no
放在一個地方,就像展示的那樣。關於
LATERAL
加盟:關於 ARRAY 建構子:
手冊中關於連接表的基本知識。