2017-10-26 11 views
0

おそらく悪いタイトルですが、わかりやすい説明が見つかりませんでした。左から1列を取得する

insert into objects values(1,'Jack'); 
insert into objects values(2,'Penny'); 

そして "GEO" で:だから私は、 "オブジェクト" にいくつかのデータを挿入

Table Objects: 

ID 
NAME 

Table Geo: 

ID 
NAME 
PARENT_ID (int) 
IDENTIFIER (varchar) 

Table ObjectsGeo: 

ID 
OBJECT_ID 
GEO_ID 

insert into geo values(1,'USA', null, '001'); 
insert into geo values(2,'New York', 1, '1001');  
insert into geo values(3,'England', null, '002'); 
insert into geo values(4,'London', 3, '1002'); 

これら

は、イムは、作業テーブルですジャックがニューヨークに住んでいれば、私はこのように挿入します:

insert into ObjectsGeo values(1,1,1); 
insert into ObjectsGeo values(2,1,2); 

これは悪いデータベース設計だと言えば、私は同意する(他の誰かがこれをコード化した)。しかし、これは私が現在行っていることであり、設計上の変更は複雑になる可能性があります。

私はデータベースからJackを取得する必要があるとき、彼がどこに住んでいるか知りたいので、私は "ObjectsGeo"を含むように左の結合を持っているかなり醜い何かをします。私は最初の行(一口)を取るだけで、プログラミングコードでオブジェクトに都市と国を「手動で」配置します。 2つのフィールド(国と都市)を含むJackの行を取得する方法は1つだけです。

---- EDIT ---- テーブルは多かれ少なかれ擬似コードでした。クエリ自体は(も擬似コードなど)でなければなりません:

select o.*, g.identifier from objects o left join ObjectsGeo og on og.object_id = o.id left join Geo g on g.id = og.geo_id where o.id = 1; 
+0

これまでに試したことをお伝えください。私はLeft Joinがあなたのためにトリックをすると思います。 –

+0

あなたが試したものと実際の出力が必要なものを投稿してください – XING

+0

私が書いたIMの実際のテーブルではありません。だから、私は推測する(使用しているものから変換された)クエリーは次のようになっているはずです:select o。*、g.identifier オブジェクトfrom left join ObjectsGeo og on og.object_id = o.id left join Geo g on g。 id = og.geo_id o.id = 1; – oderfla

答えて

1

次のクエリでは、仕事を得るだろう:あなたは何の疑い(複数可)した場合

select o.name, 
     (select name from geo where id = min(og.geo_id)) as geo_country, 
     (select name from geo where id = max(og.geo_id)) as geo_city 
from objects o 
inner join objectsgeo og 
on og.object_id = o.id 
inner join geo g 
on g.id = og.geo_id 
group by og.object_id; 

Click here for Demo

は、お気軽に以下のコメントで尋ねる

希望すると助かります!

関連する問題