2011-11-23 6 views
1

すべての項目名とその項目コードが表示される表があります。SQLの複数行の代わりに1行の値を取得する方法

表項目

ItemID, ItemName 
772729918, 'ABC' 
772729921, 'BCD' 
772729922, 'EFG' 
772729923, 'HIJ' 
772729926, 'KLM' 

Iは、定義されたアイテム画像経路を有する別のテーブルを持っています。

TableImages

itemimageID, Imagesurface,ImagePath, fitemID 
111,'FRONT', '772729918_1_1_FRONT.tif', 772729918 
112,'BACK', '772729918_1_1_BACK.tif',772729918 
222,'FRONT','772729921_1_1_FRONT'.tif,772729921 
223,'BACK','772729921_1_1_BACK.tif',772729921 
333,'FRONT','772729922_1_1_FRONT.tif',772729922 
332,'BACK', '772729922_1_1_BACK.tif',772729922 
444,'FRONT','772729923_1_1_FRONT.tif',772729923 
442,'BACK', '772729923_1_1_BACK.tif',772729923 
555,'FRONT','772729926_1_1_FRONT.tif',772729926 
552,'BACK', '772729926_1_1_BACK.tif',772729926 

私は私は以下のように値を取得していますこれら二つのテーブルを結合する場合。

セレクトアイテムID、ItemNameの、Imagesurface、ImagePathの表項目から私 インナーはti.fitemID = i.ItemID

772729918,'ABC','FRONT','772729918_1_1_FRONT.tif' 
772729918,'ABC','BACK','772729918_1_1_BACK.tif' 
772729921,'BCD','FRONT','772729921_1_1_FRONT.tif' 
772729921,'BCD','BACK','772729921_1_1_BACK.tif' 
772729922,'EFG','FRONT','772729922_1_1_FRONT.tif' 
772729922,'EFG','BACK','772729922_1_1_BACK.tif' 
772729923,'HIJ','FRONT','772729923_1_1_FRONT.tif' 
772729923,'HIJ','BACK','772729923_1_1_BACK.tif' 
772729926,'KLM','FRONT','772729926_1_1_FRONT.tif' 
772729926,'KLM','BACK','772729926_1_1_BACK.tif' 

にTableImages TIに参加実際に私が一列に代わりの2行にそれらを表示したいです各項目ごとに 私を助けてくれてありがとう。

ItemID, ItemName, ImageSurface, ImageFront, ImageBack 
772729918,'ABC','FRONT','772729918_1_1_FRONT.tif','772729918_1_1_BACK.tif' 
772729921,'BCD','FRONT','772729921_1_1_FRONT.tif','772729921_1_1_BACK.tif' 
772729922,'EFG','FRONT','772729922_1_1_FRONT.tif','772729922_1_1_BACK.tif' 
772729923,'HIJ','FRONT','772729923_1_1_FRONT.tif','772729923_1_1_BACK.tif' 
772729926,'KLM','FRONT','772729926_1_1_FRONT.tif','772729926_1_1_BACK.tif' 

答えて

4
SELECT itemid, 
     itemname, 
     imagesurface, 
     fti.imagepath AS imagefront, 
     bti.imagepath AS imageback 
FROM tableitem i 
     LEFT JOIN tableimages fti 
     ON fti.fitemid = i.itemid 
      AND fti.imagesurface = 'FRONT' 
     LEFT JOIN tableimages bti 
     ON bti.fitemid = i.itemid 
      AND fti.imagesurface = 'BACK' 
0

代わりに、内側の左結合を試してみてください。これは、一度左手のテーブルからすべての項目を含めると、彼ら場合は、idと右手のテーブル内のすべての項目と一致します

Select i.ItemID, i.ItemName, ti.Imagesurface, ti.ImagePath 
from TableItem i Left join TableImages ti  
on ti.fitemID = i.ItemID 

に参加存在する。そうでない場合はNUll

0

「ピボット」と呼ばれるものを行う必要があります。ここでは例です:

方法 INNER JOIN作品だ
SELECT pivottable.* FROM 
(
    Select ItemID,ItemName, Imagesurface,ImagePath from TableItem i inner join TableImages ti on ti.fitemID = i.ItemID 
) as baseTable 
PIVOT 
(
min(imagepath) for ImageSurface in ([FRONT],[BACK]) 
) as pivottable 
+0

注 - これは、私が正しい方向であると信じるものに向けたちょっとしたスタートです。頻繁に100%の権利を得るには、試行錯誤を繰り返していく必要があります。 –

2

...あなたの参加条件に一致する複数の行を持っているので、あなたにも設定し、あなたの結果に複数の行を取得します。

あなたはサブクエリを使ってあなたが望むものを得ることができます。

SELECT ItemId 
     ,ItemName 
     --,(SELECT TOP 1 ImageSurface FROM TableImages WHERE fItemId = ItemId) 
     ,(SELECT TOP 1 ImagePath FROM TableImages WHERE fItemId = ItemId AND ImageSurface = 'FRONT') ImageFront 
     ,(SELECT TOP 1 ImagePath FROM TableImages WHERE fItemId = ItemId AND ImageSurface = 'BACK') ImageBack 
FROM TableItem 

ImageSurfaceフィールドは、不要と思われたためコメントアウトしました。

+0

+1のコメントは画像の表面フィールドから –

+0

ありがとうJeremy Wiggins、 これはパフォーマンスを調べると少し遅いかもしれません。私に助言してください。 – desi

関連する問題