Postgresql
查詢父表並獲取子表列
我有兩張表,一張繼承另一張:
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
繼承的列值集在所有子表中必須是唯一的。