2012-02-02 67 views
2

我有一个父表和几个子表,其结构从父之一,彼此略有不同。我可以组装一个查询,从父表和所有附加列中获取所有子表吗?Postgres的:从父表中选择数据和所有子表

+2

发布表结构,示例行和您想要的结果。 – bos 2012-02-02 15:02:43

+0

jQuery从哪里进来? – Henry 2012-02-02 15:02:44

回答

1

使用合适的模式和使用INHERITS告诉PostgreSQL的有关结构:

CREATE TABLE foo(x int); 

CREATE TABLE bar(y int) INHERITS (foo); -- <=== 

INSERT INTO foo(x) VALUES(1); -- one record 
INSERT INTO bar(x,y) VALUES(2,3); -- one record 

SELECT * FROM foo; -- two results 

SELECT * FROM ONLY foo; -- one result, see ONLY 

http://www.postgresql.org/docs/current/interactive/ddl-inherit.html

+0

不是什么问,OP(和我)需要列,而不是行。即像'SELECT * FROM foo WHERE x = ?;'这样的查询,如果该特定行属于表'bar',它将返回带有'x'和'y'列的结果。 – raveren 2013-11-04 12:49:57

0

答案很简单,你不能轻易做到这一点。你不能有锯齿状的行(不像Informix),所以一个简单的选择方法是行不通的。

你也许可以以编程方式创建,将使用row_to_json和一堆工会语句的查询,但是这是一个很大的工作,非常复杂的,也许不是你想要的。它也无法解决列在不同子表中可能具有相同名称但含义不同的情况。

在一般情况下,我认为你需要重新考虑在这里你的方法。如果你试图依赖锯齿状的行,你的应用程序和你的数据库之间会有很多非常松散的契约,所以你将会遇到很多潜在的独特问题。

这里的最好的办法是关闭移动额外的列到表连接,你可以使用left join对它们进行检索。

1

好像什么你需要在这里是使用左外连接。再次,不是一个理想的解决方案,可能一个在结构上与数据库的变化会更好,不过,在这里它是:

CREATE TABLE foo(x int); 

CREATE TABLE bar(y int) INHERITS (foo); 

INSERT INTO foo(x) VALUES(1); 
INSERT INTO bar(x,y) VALUES(2,3); 

SELECT foo.*, bar.y 
FROM foo LEFT OUTER JOIN bar ON (foo.x = bar.x); 

只是在父母的条目具有空值Y,将必须采取考虑到,但它确实提取了所有的数据。这里的缺点是您需要专门命名子表中的额外列。 (尽管我发现最好避免在进入代码的查询中使用*)无论如何,

如果你真的不想在子表中命名列,那么有一篇关于如何选择除某些栏目here。你可以弄清楚如何把两者结合在一起。

编辑:

如果Y可以被设置为null,这是重要的什么之间是一种合法的条Y空和非ligitimate富Ÿ空来区分,可以改为尝试这个办法:

SELECT 'foo' AS from_table, *, NULL::int AS y 
FROM ONLY foo 

UNION 

SELECT 'bar' AS from_table, * 
FROM bar; 

然后在代码结束时,您可以使用从表列,以处理来自什么地方走过来,告诉其空y值是合法的,哪些不是。