如何在没有union子句的情况下优化?

时间:2015-11-19 09:44:30

标签: sql database tsql sql-server-2008-r2

是否可以在没有union子句的情况下编写以下查询。

select ProductId,ImageName,ImageType, ROW_NUMBER() over (order by ProductId desc) RowId 
from
                (
                    select p.id ProductId ,p.pic_image ImageName,'pic_image' ImageType
                    from product p
                    left outer join iimages_edited pe on p.id = pe.[id] 
                    where isnull(p.pic_image,'') <> '' and isnull(pe.pic_image,0)=0 
                    union
                    select p.id ProductId,p.pic_bimage ImageName,'pic_bimage' ImageType
                    from product p 
                    left outer join iimages_edited pe on p.id = pe.[id] 
                    where isnull(p.pic_bimage,'') <> '' and isnull(pe.pic_bimage,0)=0
                    union
                    select p.id ProductId,p.pic_limage ImageName,'pic_limage' ImageType
                    from product p 
                    left outer join iimages_edited pe on p.id = pe.[id] 
                    where isnull(p.pic_limage,'') <> '' and isnull(pe.pic_limage,0)=0 
                    union
                    select p.id ProductId,p.pic_blimage ImageName,'pic_blimage' ImageType
                    from product p 
                    left outer join iimages_edited pe on p.id = pe.[id] 
                    where isnull(p.pic_blimage,'') <> '' and isnull(pe.pic_blimage,0)=0 
                    union
                    select p.id ProductId,p.pic_cimage ImageName,'pic_cimage' ImageType
                    from product p 
                    left outer join iimages_edited pe on p.id = pe.[id] 
                    where isnull(p.pic_cimage,'') <> '' and isnull(pe.pic_cimage,0)=0       
            )t 
  

上面的查询有相同的表但不同的条件,它是   可以在一个查询中完成吗?

非常感谢任何帮助!

提前致谢

1 个答案:

答案 0 :(得分:2)

您似乎每次都重复使用不同列的相同连接和过滤器。在连接之前,您可以在每个表上使用UNPIVOT将它们转换为行:

select pe.ProductId, p.ProductId, p.ImageName, p.ImageType, ROW_NUMBER() 
over (order by p.ProductId desc) RowId 
from (
  select id as ProductId, ImageType, ImageName
  from product
  unpivot (
    ImageType for ImageName 
    in (pic_image, pic_bimage, pic_limage, pic_blimage, pic_cimage)
  ) t
) as p
left outer join (
  select id as ProductId, ImageType, ImageName
  from iimages_edited
  unpivot (
    ImageType for ImageName 
    in (pic_image, pic_bimage, pic_limage, pic_blimage, pic_cimage)
  ) t
) as pe
on p.ImageType = pe.ImageType
  and p.ProductId = pe.ProductId
where pe.ProductId is null

UNPIVOT过滤了null个值,因此可能不需要ISNULL