2011-11-23 36 views
1

我有表显示所有项目名称及其项目代码的表格。如何获取1行中的值而不是SQL中的多行

表项

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

我有具有限定的项图像路径另一个表。

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我 内部联接TableImages缇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' 

其实我想告诉他们在一排,而不是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

尝试左连接,而不是内部联接

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

这将包括从你的左手表中的所有项目一次并与ID,如果他们匹配在右手表中的所有项目存在。 NUll如果他们不

0

你需要做所谓的“枢轴”。这里有一个例子:

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

那怎么一个INNER JOIN作品?因为你有匹配您的加盟条件是多行,你会得到你的结果集以及多行。

尽管你可以使用子查询来得到你想要的。

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

相关问题