2012-10-09 18 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