2015-10-05 40 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 
相關問題