Postgresql

Postgres 未在 array_agg 查詢中返回數據,如下所示

  • January 14, 2021

當特定圖書館中沒有書籍數據時,就會出現問題。考慮以下工作場景。

桌子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

ALEFT 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 建構子:

手冊中關於連接表的基本知識。

引用自:https://dba.stackexchange.com/questions/283198