【问题标题】:Get child table names in Postgres query [duplicate]在 Postgres 查询中获取子表名 [重复]
【发布时间】:2017-10-23 00:44:28
【问题描述】:

我有一个基表

CREATE TABLE base_table (
  id SERIAL PRIMARY KEY
);

还有两个继承自它的子表

CREATE TABLE child_a (
  description TEXT
) INHERITS (base_table);

CREATE TABLE child_b (
  age INT
) INHERITS (base_table);

我正在尝试编写一个查询,该查询将返回基表及其所有子表中的所有字段,但还将每行的“父”表的名称附加到结果中。

到目前为止,我可以获得所需的所有其他字段

SELECT id, description, age
FROM ONLY base_table
NATURAL FULL JOIN child_a
NATURAL FULL JOIN child_b

我对如何在结果中包含父表名感到有些困惑。我希望结果类似于

Id, Description,      Age,   TableName
---------------------------------------
1   TestDescription   null   child_a
2   null              10     child_b
3   OtherDescription  null   child_a

任何帮助将不胜感激!

【问题讨论】:

标签: sql postgresql


【解决方案1】:

使用子查询而不是子表:

SELECT id, description, age, coalesce(t1, t2) as tablename
FROM base_table
NATURAL FULL JOIN (
    SELECT *, 'child_a'::text AS t1
    FROM child_a
    ) a
NATURAL FULL JOIN (
    SELECT *, 'child_b'::text AS t2
    FROM child_b
    ) b;

 id |   description    | age | tablename 
----+------------------+-----+-----------
  1 | TestDescription  |     | child_a
  2 |                  |  10 | child_b
  3 | OtherDescription |     | child_a
(3 rows)    

更新。 in ths answer 描述了一个很好的解决方案。要在这种情况下使用它,您必须为 system column tableoid: 显式指定 base_table

SELECT *, base_table.tableoid::regclass::text AS table_name
FROM base_table
FULL JOIN child_a USING(id)
FULL JOIN child_b USING(id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 2018-02-09
    • 2021-07-10
    • 2014-03-20
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多