【问题标题】:Oracle get first record from result setOracle 从结果集中获取第一条记录
【发布时间】:2015-10-05 14:36:09
【问题描述】:

我有一个类似的查询,下面给出了以下结果。对于一个给定的 pcid,可能有一个或多个图像。如果 pcid 返回的图像超过 1 个,我只想获取第一条记录。我知道 distinct 在这种情况下不起作用。任何想法将不胜感激。谢谢

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

【问题讨论】:

  • 你如何表示“第一”是有日期时间还是只需要任何记录?如果是这样,您始终可以在子查询中对图像名称使用 min 然后加入。使用 PC_goods 表的内联视图使用 min/max 返回每个 PCID 的单个记录,然后将其加入结果集中。或者,您可以生成一个行号字段并返回每个 PCiD 仅为 1 的位置。 Example:
  • 是的,它是任何 img 记录
  • 我不明白为什么您的查询需要在 pc_goods 上进行左连接?

标签: sql oracle greatest-n-per-group


【解决方案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

【讨论】:

  • 谢谢!这很好用,有没有一个简单的例子来解释 partiionby 和 row_number() 函数?我对这些不是很熟悉,我知道这些在 oracle 中非常方便。我确实尝试在网上查找,但大多数都太复杂了。
【解决方案2】:

没有测试或解决为什么需要左连接...... 如果 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多