2012-10-09 17 views
2

例如:我说,我有2种模式和选择所有引用的表

create table a.foo(
     id integer primary key, 
     val integer); 

    create table b.main(
     id serial primary key, 
     val integer references a.foo(id)); 

    create table b.foo(
     k integer primary key references b.main(id), 
     v timestamp with time zone); 

    create table b.bar(
     k integer primary key references b.main(id), 
     v timestamp with time zone); 
创建4个表

的伪什么我在寻找代码:选择b.main.id被引用的所有表;

结果会是什么样子:

b.main.id | b.main.val | b.foo.k | b.foo.v | b.bar.k | b.bar.v 
     1   1   1  TimeStamp 1  TimeStamp 
     2   1   2  ....  2  .... 

现在我已经实现了这个查询为:

select * from b.main, 
      (select * 
       from b.foo, 
        (select * from b.bar where b.bar.v > somedate) as morebar 
       where b.bar.k = b.foo.k) as morefoo 
    where b.main.id = b.foo.k; 

回到问题。 Postgres中是否有一项功能允许我们在引用主键的所有表上执行选择?在我的情况下,所有引用b.main.id的表

我已经通过Postgresql文档搜索,但还没有找到我在找什么。建议?

+0

嗨@fbynite,没有工作我的回答?这个查询是“like”'选择引用b.main.id的所有表;' – doctore

回答

1

我还没有找到自己的方法来自动选择引用表的主键的其他表。看来你还是不得不提一下/在查询中手动输入其他表,但这里的使用连接查询的一个短版:

select * 
from b.main a, b.foo b, b.bar c 
where a.id = b.k 
and a.id = c.k 

select a.*, b.*, c.* 
from b.main as a 
inner join b.foo as b on a.id = b.k 
inner join b.bar as c on a.id = c.k 
+0

像你一样,我还没有找到一种方法来选择引用主键的所有行/列。我很欣赏你提供的替代查询。谢谢。 – fbynite

0

你可以试试:

SELECT tc.constraint_name, tc.table_name, kcu.column_name, 
     ccu.table_schema AS foreign_schema, 
     ccu.table_name AS foreign_table_name, 
     ccu.column_name AS foreign_column_name 
FROM information_schema.table_constraints AS tc 
JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name 
JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name 
WHERE constraint_type = 'FOREIGN KEY' 
AND ccu.table_schema = 'b' 
AND ccu.table_name='main' 
AND ccu.column_name = 'id'; 
+0

你的回答更像是“选择引用b.main.id的所有表名”。我错过了什么?我希望的结果(实质上)是引用主键的所有表的连接。 – fbynite