Oracle 从结果集中获取第一条记录
Oracle get first record from result set
我有一个类似的查询,下面给出了以下结果。对于一个给定的 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
没有测试或解决为什么需要左连接...
如果 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
您可以为此使用 row_number
window 函数:
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
我有一个类似的查询,下面给出了以下结果。对于一个给定的 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
没有测试或解决为什么需要左连接... 如果 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
您可以为此使用 row_number
window 函数:
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