oracle 如何只选择满足条件的第一行?

taor4pac  于 2023-10-16  发布在  Oracle
关注(0)|答案(5)|浏览(173)

我在两个表之间做一个连接,并添加一个条件,希望只获得满足连接条件和“外部”条件的第一行。
例如,此查询:

select * from PRMPROFILE p, user v
where 
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%';

首先,我想知道如何使用配置文件(v.profile或p.id)* 对内部连接的结果进行分组。之后,如何只显示每个组的第一次出现。
先谢了。

bxgwgixi

bxgwgixi1#

您可以使用分析查询:

select *
from (
    select p.*, v.*,
        row_number() over (partition by p.id order by v.userid) as rn
    from prmprofile p
    join user v on v.profile = p.id
    where p.language = 0
    and v.userid like '%TEST%'
)
where rn = 1;

内部查询获取所有数据(但使用*并不理想),并添加一个额外的列,为每个p.id值分配一个行号序列。它们必须按某种顺序排列,而且您还没有说明是什么使特定行成为“第一行”,所以我猜是用户ID -当然,您可以将其更改为更合适的值,这样在查询被删除时将提供给予一致的结果。(您可以查看rankdense_rank,以获得选择“第一”行的替代方法)。
外部查询只是将结果集限制为额外列的值为1的那些结果集,这将为每个p.id提供给予一行。
另一种方法是使用一个子查询来标识“第一”行并连接到该行,但不清楚标准是什么以及是否具有足够的选择性。

ybzsozfc

ybzsozfc2#

请尝试:

select * from(
  select *, 
    row_number() over (partition by v.userid order by v.userid) RNum
  from PRMPROFILE p, user v
  where 
  p.id = v.profile
  and p.language = 0
  and v.userid like '%TEST%'
  )x 
where RNum=1;
iyfjxgzm

iyfjxgzm3#

select * from PRMPROFILE p, user v
where p.id = v.profile and p.language = 0
and v.userid like '%TEST%'
fetch first 1 row only
vjrehmav

vjrehmav4#

可以使用LIMIT关键字。

select * from PRMPROFILE p, user v
where 
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%'
limit 1
wr98u20j

wr98u20j5#

它将只显示最上面的结果

select top 1 * from PRMPROFILE p, user v
where 
    p.id = v.profile
    and p.language = 0
    and v.userid like '%TEST%';

相关问题