如何在Join 2表之后选择具有不同外键的第一个记录

时间:2017-09-02 18:42:31

标签: sql sql-server join distinct

我有2张桌子 ProductTBL(ID,名称,价格) imageTBL(ID,ID_FK,imageName) 对于ProductTBL中的每个记录,imageTBL中有多条记录 我想从imageTBL中仅为每条记录选择第一张图像 我使用ProductTBL左连接imageTBL,但我的查询不正确 请帮我解决 日Thnx 这是我不正确的查询:

create procedure test
as
begin
select * from ProductTBL as ProTBL
left join (select * from PicTBL as PicAll left join (select distinct ProductID_FK from PicTBL as picTblID))as pic
on ProTBL.ProductID = pic.ProductID_FK
where ProTBL.Pro_CatID = 4
end

3 个答案:

答案 0 :(得分:0)

首先您的查询与您的表和列名称不匹配。其次,您需要为每个产品定义所需的PicTBL记录(如何定义哪个图像是产品的第一个图像)。我的回答假设第一张图片是ID较低的图片。

可能的查询是:

b

您应该使用视图(物化/索引视图)来备份内部查询并优化性能。

答案 1 :(得分:0)

尝试以下查询:

SELECT picid, prodid, picture from 
(
SELECT picid, prodid, picture ,row_number() over (partition by prodid ORDER BY prodid desc) as prod
FROM t_picture
) t_prod_pic

where t_prod_pic.prod=1

它返回图片表中所有产品的第一张图片

答案 2 :(得分:0)

我找到了2个解决方案,第一个将返回一个图像,但不一定是第一个。在另一个解决方案中,您可以选择所需的图像。 第一个解决方案:

SELECT  [id]
  ,[Name]
  ,[Price]
  ,Max(pic.imageName)
  FROM ProductTBL as ProTBL
  left join (select * from PicTBL) pic
  on ProTBL.ProductID = pic.ProductID_FK
  where ProTBL.Pro_CatID = 4
  group by id,Name,price 

选择按照pic.name

降序的第一个图像排序的第二个解决方案
select * from
  (SELECT  [id]
     ,[Name]
     ,[Price]
     ,pic.imageName
     ,ROW_NUMBER() OVER(PARTITION BY id ORDER BY pic.imageName) AS RowNumber
     FROM  ProductTBL as ProTBL
      left join (select * from PicTBL) pic
     on ProTBL.ProductID = pic.ProductID_FK
     where ProTBL.Pro_CatID = 4
     ) XX
    where RowNumber = 1;
希望你找到这个方便的。