2015-10-05 69 views
0

我有一个查询,下面给出了以下结果。对于给定的pcid,可能有一个或多个图像。我只想抓住第一个记录,如果pcid有超过1个图像返回。在这种情况下,我知道独特性不起作用。任何想法将不胜感激。感谢Oracle从结果集中获得第一个记录

select p.pcid,p.pc_name,p.pc_image_name 
from pc p LEFT JOIN pc_goods pcm on p.pcid = pcm.pcid AND pcm.media_type = 'I' 
AND pcm.act_ind = 'Y' AND pcm.fea_ind = 'Y' INNER JOIN pc_cat pcat 
ON p.category_id = pcat.cat_id 
and p.fea_ind = 'Y' AND p.act_ind = 'Y' 
order by pcid 

Current results  
    pcid pc_name pc_image_name 
    -------------------------------- 
    1120 testone one.jpg 
    1120 testwo two.jpg 
    1121 testthree three.png 
    1125 testfour four.png 
    1128 test5  five.jpg 
    1128 test6  six.jpg 

预期的效果,

pcid pc_name pc_image_name 
-------------------------------- 
1120 testone one.jpg 
1121 testthree three.png 
1125 testfour four.png 
1128 test5  five.jpg 
+0

你如何表示“第一”是有日期时间还是只需要任何记录?如果是这样,您可以在子查询中始终使用图像名称上的min,然后回到上面。使用min_max将PC_goods表的内联视图返回给每个PCID的单个记录,然后将其添加到结果集中。或者你可以生成一个行号字段,并返回每个PCiD只有1的地方。 [示例:](http://stackoverflow.com/questions/10477085/oracle-partition-by-and-row-number-keyword) – xQbert

+0

是的,它是任何img记录 – user747291

+0

我不明白为什么你的查询需要做'pc_goods'上的左连接? – sstan

回答

1

可以使用row_number窗口功能如下:

row_number() over (partition by p.pcid order by null) as rn 

...这里您pcid分区。由于您似乎不在乎选取哪张图片,因此您可以通过任何常数值进行排序(在这种情况下,我使用了null)。

select pcid,pc_name,pc_image_name 
    from (
    select p.pcid,p.pc_name,p.pc_image_name, 
      row_number() over (partition by p.pcid order by null) as rn 
    from pc p LEFT JOIN pc_goods pcm on p.pcid = pcm.pcid AND pcm.media_type = 'I' 
    AND pcm.act_ind = 'Y' AND pcm.fea_ind = 'Y' INNER JOIN pc_cat pcat 
    ON p.category_id = pcat.cat_id 
    and p.fea_ind = 'Y' AND p.act_ind = 'Y') 
where rn = 1 
order by pcid 
+0

谢谢!这工作完美,是否有一个简单的例子来解释partiionby和row_number()函数?我对这些并不是很熟悉,我知道这些在oracle中非常方便。我确实尝试在网上查找,但其中大部分都太复杂。 – user747291

+1

[常规分析函数信息](http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174)和[row_number特定信息](http://docs.oracle.com /cd/E11882_01/server.112/e41084/functions156.htm#SQLRF06100) – sstan

1

未经测试或解决为什么左连接需要... 这样的事情可能会工作提供了一个imageName是独一无二的。

SELECT p.pcid,p.pc_name,p.pc_image_name 
FROM pc p 
LEFT JOIN pc_goods pcm 
    on p.pcid = pcm.pcid AND pcm.media_type = 'I' 
AND pcm.act_ind = 'Y' AND pcm.fea_ind = 'Y' 
INNER JOIN (SELECT max(pc_image_name) maxImage, pcID from PC_GOODS group by PCID) PCM2 
on PCM2.maxImage=PCM.Pc_image_name 
and PCM2.PCID = PCM2.PCID 
INNER JOIN pc_cat pcat 
    ON p.category_id = pcat.cat_id 
    and p.fea_ind = 'Y' AND p.act_ind = 'Y' 
order by pcid 
相关问题