Postgresql

查詢父表並獲取子表列

  • February 13, 2022

我有兩張表,一張繼承另一張:

CREATE TABLE parent (
   col1 INTEGER
);

CREATE TABLE child (
   col2 INTEGER
) INHERITS( parent );

// Insert some data
INSERT INTO parent( col1 ) VALUES( 1 );
INSERT INTO child( col1, col2 ) VALUES( 2, 2 );

有什麼方法可以查詢父表,以便獲取子表的所有列?

此查詢僅返回父列:

SELECT * FROM parent;

| col1 |
| ---- |
| 1    |
| 2    |

我想要的查詢將返回父項和子項中的所有列:

SELECT ...  -- some query, with desired result:

| col1 | col2 |
| ---- | ---- |
| 1    | NULL |
| 2    | 2    |

只要繼承的列值集在所有表中都是唯一的,就有一個簡單的**NATURAL**連接解決方案(此子句的罕見案例之一!):

SELECT * FROM ONLY parent NATURAL FULL JOIN child;

因為NATURAL是(根據文件):

… 一個列表的簡寫,USING它提到了兩個表中具有相同名稱的所有列。

在沒有顯式列表的情況下,您只獲得每列一次SELECT,並且父表中的行使用 NULL 值擴展為添加的列 - 正是您想要的方式。

這甚至適用於任何列中的 NULL 值。

查看結果中每一行的來源,讓我們在測試案例中添加另一行:

INSERT INTO child(col1) VALUES(1);

然後:

SELECT COALESCE(p.tableoid, c.tableoid)::regclass AS tbl, *
FROM   ONLY parent p NATURAL FULL JOIN child c;

tbl   | col1 | col2
-------+------+----
parent | 1    | NULL
child  | 1    | NULL
child  | 2    | 2

db<>fiddle here - 有更多測試行

Old sqlfiddle

如果所有子表中的所有附加列都是唯一的,則可以通過這種方式加入多個子表。否則,您必須拼出一個明確的列表和明確的連接條件。SELECT

繼承的列集在所有子表中必須是唯一的。

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