我将执行两个表之间的连接操作,并添加一个条件,希望仅获取满足连接条件和“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)将此内部连接的结果分组。然后如何仅显示每个组的第一个出现。
提前感谢。
您可以使用分析查询来完成此操作:
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
提供一行。
另一种方法是使用子查询来识别“第一行”并加入该行,但不清楚标准是什么以及是否足够选择性。
profile
和 user
表是否有相同名称的列?如果是,你需要显式地列出它们,而不是使用 *
,并为重复的列取别名,以便它们看起来具有不同的名称(假设你确实想检索两个表的数据)。 - Alex Pooleselect
如果它们都有一个名为name
的列(例如或者其中一个有rn
),就会出现错误。请在问题中添加表定义。 - Alex Poole请尝试以下方法:
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;
select * from PRMPROFILE p, user v
where
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%'
limit 1
LIMIT
语句。此外,这也无法解决问题中提到的“分组”部分;原帖作者希望每个profile ID只有一行结果,而不是整个查询只有一行结果。 - Alex Pooleselect * 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%';
and ROWNUM=1
(参见 Oracle 文档)吗?补充说明:这将为您提供仅 1 个匹配结果,但在查询中可能不一致。另请参阅 ROWID。 - wmorrison365