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

时间:2013-04-16 10:06:35

标签: sql oracle select join group-by

我正在两个表之间进行连接并添加一个条件,只想获得满足连接条件和“extern”条件的第一行。

此查询例如:

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

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

提前致谢。

5 个答案:

答案 0 :(得分:6)

您可以使用分析查询:

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提供一行。

另一种方法是使用子查询来标识“第一”行并加入到该行,但不清楚标准是什么以及它是否足够有选择性。

答案 1 :(得分:3)

请尝试:

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;

答案 2 :(得分:1)

您可以使用LIMIT关键字。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

它只显示最高结果

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