我正在两个表之间进行连接并添加一个条件,希望只获得满足连接条件和“外部”条件的第一行。
例如这个查询:
select * from PRMPROFILE p, user v
where
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%';
首先,我想知道如何使用配置文件(v.profile 或 p.id)对这个内部连接的结果进行分组。之后如何只显示每个组的第一次出现。
提前致谢。
您可以为此使用分析查询:
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 - 您当然可以将其更改为更合适的东西,这样会在重新运行查询。(您可以查看rank
并dense_rank
寻找替代方法来选择“第一”行)。
外部查询只是将结果集限制为额外列具有值的那些1
,这将为您提供每一行p.id
。
另一种方法是使用子查询来识别“第一”行并加入该行,但尚不清楚标准是什么以及它是否具有足够的选择性。
请试试:
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;
您可以使用 LIMIT 关键字。
select * from PRMPROFILE p, user v
where
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%'
limit 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
它只会显示最上面的结果
select top 1 * from PRMPROFILE p, user v
where
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%';