2016-06-22 7 views
0

行あるクエリ結果を平らにし、私は、子テーブル内のIDは、親テーブルからの外部キーである親テーブルにが側柱によって側へ

ID Name 
1  abc 
2  def 

と子テーブル

ID LineId Item 
1  1  A001 
1  2  A002 
2  1  B001 
2  2  B002 

を持っていますIDとLineIdの両方が子テーブルの主キーを構成します。

私はこのように、子テーブルから行が列になり、同じ外部キーを持つフラットな結果を生成するために、親と子テーブルの両方から「ID」に基づいて、これらの二つのテーブルに参加したい:

ID Name Item1 Item2 ..... 
1  abc A001  A002 
2  def B001  B002 
+0

は最大LineID 2ですか? 'MAX(CASE WHEN LineID = 1 THEN Item)Item1、MAX(CASE WHEN LineID = 2 THEN Item)Item2'は、IDと名前でグループ分けします。詳細については、ケース集約を含むグループ別の検索を実行してください。 – ZLK

+0

LineIdは、特定のIDの各エントリのキーに過ぎません。その最大値は2ではありません.2つ以上のID(外部キー)のエントリがある場合は2以上になる可能性があります – Harrobbed

+0

最大数が2であるかどうかを尋ねるのは、単純な 'MAX(CASE ...')クエリ例えば、「P.ID、P.Name、MAXを選択します(LineID = 1 THEN Item)」項目1、MAX(CASE WHEN LineID = 2 THEN Item)項目2 FROM tblParent PbloseTblChild C ON C.ID = P.ID GROUP BY P.ID、P.Name'。LineIDが任意のサイズに拡大できる場合は、おそらく(最大LineIDに基づいて)動的SQLを使用する必要があります。 – ZLK

答えて

0

あなたはこのような動的SQLを使用する必要があります。

DECLARE @sql nvarchar(max) = 'SELECT p.ID, p.Name'; 

SELECT @sql = @sql + ',MAX(CASE WHEN c.LineId = ' + CAST(LineId as nvarchar(5)) + ' THEN c.Item END) As Item' + CAST(LineId as nvarchar(5)) 
FROM childTable 
GROUP BY LineId; 

SET @sql = @sql + ' FROM parentTable p JOIN childTable c ON p.ID = c.ID GROUP BY p.ID, p.Name'; 
EXEC(@sql); 
関連する問題