2012-10-16 160 views
0

我有一個產品表和一個單獨的任何特定產品的圖像表。將SQL多個表合併爲一個

tblProducts

  • 的productID
  • PRODUCTNAME

tblProductImages

  • 的productID
  • 映像文件名稱

我可以通過兩個單獨的查詢返回該產品的產品詳細信息和產品圖像,但我不確定如何將其置於一個查詢中?

因此,例如,我想看看:

productID productName imageFilename imageFilename imageFilename 

我的結果集(需要是動態的,因爲有可能會從每個產品上傳1到10的圖像是任何東西)。

這是我能用PIVOT做的事嗎?

感謝

+1

你真的想擁有動態數你的結果中的列? –

+1

如果imagefile不存在,那麼你的結果中是否有10列固定並保留爲空值? – AnandPhadke

+1

我強烈建議或者保留規範化集合(有兩個查詢)或一個集合(如你所願),但有固定數量的fileName字段。 – MatBailie

回答

2

可以使用PIVOT這一結果。如果您知道列的數量,那麼你可以硬編碼它們:

select * 
from 
(
    select p.productid, 
    p.productname, 
    i.imagefilename, 
    'ImageFile_' + 
     cast(row_number() over(partition by i.productid 
       order by i.productid) as varchar(10)) col 
    from tblproducts p 
    left join tblProductImages i 
    on p.productid = i.productid 
) x 
pivot 
(
    max(imagefilename) 
    for col in ([ImageFile_1], [ImageFile_2], [ImageFile_3]) 
) p 

SQL Fiddle with Demo

或者您可以使用動態SQL生成PIVOT。動態會在你有變動數的imagefilename事件工作:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' 
         + QUOTENAME('ImageFile_'+ cast(x.rn as varchar(10))) 
        from 
        (
         select row_number() over(partition by i.productid 
          order by i.productid) rn 
         from tblProductImages i 
        ) x 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT productid, productname,' + @cols + ' 
       from 
      (
       select p.productid, 
        p.productname, 
        i.imagefilename, 
        ''ImageFile_'' + 
        cast(row_number() over(partition by i.productid 
           order by i.productid) as varchar(10)) col 
       from tblproducts p 
       left join tblProductImages i 
        on p.productid = i.productid 
      ) x 
      pivot 
      (
       max(imagefilename) 
       for col in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

兩個結果將類似於此:

PRODUCTID | PRODUCTNAME | IMAGEFILE_1 | IMAGEFILE_2 | IMAGEFILE_3 
================================================================== 
1   | Product 1 | Image1  | Image2  | Image3 
2   | Product 2 | Image1  | Image2  | (null) 
3   | Product 3 | Image1  | (null)  | (null) 
4   | Product 4 | Image1  | Image2  | Image3 
5   | Product 5 | Image1  | (null)  | (null) 
0

也試着像this.Just有一個逗號separeted名每個的productID。

select p.productID, 
(select STUFF((select ','+imageFileName from tblProductImages where productID=p.productID 
for xml path('')),1,1,'')) as ImageFileNames 
from tblProducts p 
group by p.productID 
0

我想給@RomanParker。然而,當更常見的join完全足夠時,我很難使用apply。還有一些其他的更改查詢,特別是聚集之前加入到產品表:

select P.productID, P.productName, 
     imageFileName1, 
     imageFileName2, 
     imageFileName3, 
     ... 
     imageFileName10 
from tblProducts as P left outer join 
    (select I.productID, 
      min(case when I.RowNum = 1 then I.imageFileName else null end) as imageFileName1, 
      min(case when I.RowNum = 2 then I.imageFileName else null end) as imageFileName2, 
      min(case when I.RowNum = 3 then I.imageFileName else null end) as imageFileName3, 
      ... 
      min(case when I.RowNum = 10 then I.imageFileName else null end) as imageFileName10 
     from (select I.*, 
        row_number() over (partition by ProductId Order by (select NULL)) as RowNum 
      from tblProductImages as I 
      ) I 
     group by I.productID 
    ) 
    on p.productId = I.productID