2016-11-02 6 views
3

私はplaceTableというテーブルを完全に3つの列を持っています:id、parent_id、name、country、stateおよびcityテーブルが含まれています。SQL Server:同じ列をUNIONなしで1列に3回選択します

市のparent_IDはstateのidで、stateのparent_IDはcountryのidです。

そして私はcityListと呼ばれる別のテーブルを持っていますが、idはplaceTableのIDと同じです。

私が欲しいのは、表1の州と国を含むcity2 cityListのみを選択することです。以下の表2はシドニーを示しています。したがって、シドニーのid、parent_ID、および名前を取得します。オーストラリアのNSW州とその国オーストラリアのtable1。

  • 表1:placeTable
id parent_ID name 
------------------- 
1  0  Australia 
2  0  UK 
33  1  NSW 
34  1  Western Australia  
55 33  Sydney 
70 34  Perth 
  • 表2:cityList
id  name 
------------------- 
55  Sydney 

私が欲しい出力:

id parent_ID name 
------------------- 
1  0  Australia 
33  1  NSW 
55 33  Sydney 

私は以下やってますが、あまりにも長い間、私は利用可能な他のよりスマートな方法があるかもしれません考えていますで、私の望む結果を得ることができます:私は、以下試してみましたが、これは私にだけ与えることができ

Select distinct pt.id,pt.parent_id,pt.name 
from placeTable AS pt 
join cityList as cl on cl.id = pt.id 
UNION ALL 
Select distinct ly2.id,ly2.parent_id,ly2.name 
from placeTable AS pt 
join cityList as cl on cl.id = pt.id 
join placeTable AS ly2 on pt.parent_id = ly2.id 
UNION ALL 
Select distinct ly3.id,ly3.parent_id,ly3.name 
from placeTable AS pt 
join cityList as cl on cl.id = pt.id 
join placeTable AS ly2 on pt.parent_id = ly2.id 
join placeTable as ly3 on ly2.parent_id = ly3.id 

都市:

Select distinct pt.id,pt.parent_id,pt.name 
from placeTable AS pt 
join cityList as cl on cl.id = pt.id 
join placeTable AS ly2 on pt.parent_id = ly2.id 
join placeTable as ly3 on ly2.parent_id = ly3.id 
+0

私は質問を理解していない:再帰的にテーブルをルックアップして完全な子 - >親階層を出力したいのですか? – Shastick

+0

最初のSQLステートメントのSELECTリストに 'ly2.name'と' ly3.name'を追加するだけで、あなたは金色になります。あなたはそれらのテーブルを結合しますが、それらから選択しないでください... 'select distinct bu.id、bu.parent_id、bu.name、ly2.name、ly3.name' – JNevill

+1

あなたの質問は意味をなさない。 'bu'とは何ですか? –

答えて

2

これを試してみてください:

  create table #placeTable (ID int, ParentID int, Name varchar(20)) 
      insert into #placeTable (ID, ParentID, Name) 
      values (1,0,'Australia'), (2,0,'UK'), (33,1,'NSW'), (34,1,'Western Australia'), 
      (55,33,'Sydney'),(70,34,'Perth'); 

      create table #cityList (ID int, Name varchar(20)) 
      insert into #cityList (ID, Name) 
      values (55, 'Sydney'), (70, 'Perth'); 

      WITH Selects AS (
      SELECT p.*, c.ID as 'GroupID' 
      FROM #placeTable p 
      INNER JOIN #cityList c on p.ID = c.ID 

      UNION ALL 
      SELECT p.*, s.GroupID 
      FROM #placeTable p 
      INNER JOIN Selects s ON p.ID = s.ParentID 
      ) 
      SELECT ID, ParentID, Name FROM Selects ORDER BY GroupID, ID 
関連する問題