根据某些条件从多个表中读取列值 - postgreSQL
Posted
技术标签:
【中文标题】根据某些条件从多个表中读取列值 - postgreSQL【英文标题】:Reading a column value from more than one table based on some condition - postgreSQL 【发布时间】:2017-06-06 08:24:58 【问题描述】:我正在尝试为我拥有的一张表创建一个视图。对于视图中的一列,我正在尝试从我拥有的表中读取值:
表 A:
id b_id c_id d_id
1 1
2 1
3 1
表 B:
id code
1 64
表 C:
id code
1 98
表 D:
id code
1 26
在上面的表中,A 是我的主表,它分别有两个对表 B 和 C(b_id 和 c_id)的外键引用。对于表 A 中的每一行,只会填充两个引用(b_id 或 c_id)中的一个。
我的任务是为表 A 创建一个视图,比如 v_A,它将包含以下列:
查看 v_A:
code code_table
64 B
98 C
26 D
在上面的视图中,我必须首先检查表 A 中的每一行,填充了哪些外键引用,基于我必须读取列 'code' 并且列 'code_table' 将具有我正在填充“代码”列的表的名称。
我已经能够创建简单的视图,但这对我来说有点棘手。我正在检查我是否可以使用 case ...when 来做同样的事情,但在这之后也变得有点复杂了。我还可以从 information_schema 表中读取 postgres 中的表名。所以我有一些零碎的解决方案,但不明白如何将它们放在一起。
有人能指出正确的方向吗?
谢谢!!
【问题讨论】:
【参考方案1】:当然,只有当您填满一个表或另一个表时,它才会起作用 - 当两个故事都有匹配的键时,它不会解决冲突:
t=# create view _a as select coalesce(b.code,c.code,d.code) code, case when b.id is not null then 'B' when c.id is not null then 'C' when d.id is not null then 'D' end from a
left outer join b on b.id = b_id
left outer join c on c.id = c_id
left outer join d on d.id = d_id;
CREATE VIEW
t=# select * from _a;
code | case
------+------
26 | D
98 | C
64 | B
(3 rows)
【讨论】:
感谢您的回复,如果我有两个以上的表要读取怎么办。例如,对于另外 2 个表还有 2 个外键引用? 您删除视图并创建另一个视图 - 以便加入更多表 但只有当我有两个两个子表时,您的答案才有效。已编辑问题。 已编辑答案 - 只需将新表添加到查询中。删除并创建视图。就是这样以上是关于根据某些条件从多个表中读取列值 - postgreSQL的主要内容,如果未能解决你的问题,请参考以下文章