7

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

例如这个查询:

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

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

提前致谢。

4

5 回答 5

12

您可以为此使用分析查询:

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

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

于 2013-04-16T10:32:30.333 回答
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;
于 2013-04-16T10:12:48.873 回答
1

您可以使用 LIMIT 关键字。

select * from PRMPROFILE p, user v
where 
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%'
limit 1
于 2013-04-16T10:38:11.487 回答
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
于 2018-12-10T21:32:28.153 回答
0

它只会显示最上面的结果

select top 1 * from PRMPROFILE p, user v
where 
    p.id = v.profile
    and p.language = 0
    and v.userid like '%TEST%';
于 2013-04-16T10:10:05.550 回答