2017-09-19 3 views
0

多くの列を持つ2つのテーブルを結合したいと思います。 それはこのようなものになります。PostgreSQLは列を掛けずに2つのテーブルを結合します

----------------------------------------------- 
| gid | geom | ogc_fid | nuts |.... | 
| 1 | ... | ...  | ... |.... | 
| 2 | ... | ...  | ... |.... | 
| 3 | ... | ...  | ... |.... | 
| 4 | ... | ...  | ... |.... | 

を、私はより多くの列を持っていること、他のテーブルとそれに参加したいと思いますが、それらの多くは最初のものと同じであるので、それは次のようになります。

_________________________________________________________ 
| gid | geom | ogc_fid | nuts | x | y | z | 
| 1 | ... | ...  | ... |.... | . | . | 
| 2 | ... | ...  | ... |.... | . | . | 
| 3 | ... | ...  | ... |.... | . | . | 
| 4 | ... | ...  | ... |.... | . | . | 

参加後、2番目のテーブルと同じに見えるとします。しかし、最初のものと2番目のもののすべての記録があります。

select *from "migration"."X" as tab1 
full outer join "migration"."Y" as tab2 on tab1.gid = tab2.gid; 

しかし、私の結果はこれです::

は、私はこれを実行しようとしました

------------------------------------------------------------------------------------------------------- 
| gid | geom | ogc_fid | nuts |.... | gid | geom | ogc_fid | nuts | x | y | z | 
| 1 | ... | ...  | ... |.... | 1 | ... | ...  | ... |.... | . | . | 
| 2 | ... | ...  | ... |.... | 2 | ... | ...  | ... |.... | . | . | 
| 3 | ... | ...  | ... |.... | 3 | ... | ...  | ... |.... | . | . | 
| 4 | ... | ...  | ... |.... | 4 | ... | ...  | ... |.... | . | . | 

は、私は多くの異なるクエリを試してみましたが、私が望む結果を得ることはありませんでした。誰かが私を助けることができますか?クエリ以下

答えて

2

あなたは同じ名前の列を確保するためにNATURALを使用することができ、一度だけ記載されています:

SELECT * FROM "migration"."X" NATURAL FULL OUTER JOIN "migration"."Y"; 

The FROM ClauseのためにPostgreSQLのドキュメントを引用:

NATURALは、両方の入力テーブルに表示されるすべての列名で構成されるUSINGリストを形成します。 USINGと同様に、これらの列は出力表に1回だけ表示されます。共通の列名がない場合、NATURAL JOINはJOIN ... ON TRUEのように動作し、クロス積結合を生成します。

同じ名前の列の値が一致しない行がある場合、NATURAL FULL OUTER JOINは結果に複数回現れることに注意してください。たとえば、x.geomy.geomx.gid = y.gid = 1の場合、結果は2行になります.1つはxの値で、もう1つはyの値です。したがって、共有列の値が一致する場合は、gidの場合にのみこの方法を使用してください。

+0

これは完璧に動作します、ありがとうございます。 :) – speedvees

1

試してみてください。

select tab1.*, tab2.x,tab2.y,tab2.z from "migration"."X" as tab1 
full outer join "migration"."Y" as tab2 on tab1.gid = tab2.gid; 

・ホープこのヘルプ。

0

あなたはインクルードは*を使用(*は、すべての列FOの別名である)が、選択などで明示的な列名を使用していない2つのテーブル間に同じ列に選択を避けたい場合は:

Select tab1.gid, tab1.geom, tab1.ogc_fid ,tab1.nuts, tab2.geom, tab2.ogc_fid 
from "migration"."X" as tab1 
full outer join "migration"."Y" as tab2 on tab1.gid = tab2.gid; 
関連する問題