2012-02-02 34 views
2

親テーブルと親テーブルとの構造が少し違う複数の子テーブルがあります。親テーブルとすべての子テーブルのすべてのデータをすべての追加列で取得するクエリをアセンブルできますか?Postgres:親テーブルとすべての子テーブルからデータを選択

+2

テーブル構造、サンプル行、および必要な結果を投稿します。 – bos

+0

jQueryはどこに来ますか? – Henry

答えて

1

適切なスキーマおよび使用を使用することは、構造については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

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の場合はnullを持っていますしかし、それはすべてのデータを引き出します。ここでの欠点は、子テーブルから余分な列に具体的に名前を付ける必要があることです。 (とにかくコードに入るクエリで*を使用することは避けてください)

本当に子テーブルの列に名前を付ける必要がない場合は、特定の列here。あなたはどのように一緒に2つを配置するかを把握することができます。

EDIT:yがnullに設定することができ、正当なバーのyヌルと非ligitimateのfooのyヌルが何であるかを区別することが重要である場合には

、あなたの代わりにこれを試すことができます。

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

UNION 

SELECT 'bar' AS from_table, * 
FROM bar; 

次に、コードの最後にfromテーブルの列を使用してどこから来たものかを処理し、どのnull値が正当かどうかを判断できます。

関連する問題