我有两个具有一对多关系的数据库表PERSON_TABLE和FILE_TABLE。我需要能够将结果限制为给予前X行的人数。同时能够在FILE_TABLE中的列上进行 join 和过滤。我需要获取前两个person,而不管文件表上的连接生成多少行。
PERSON_TABLE
| ID|名称|
| --|--|
| 1 |埃里克|
| 2 |约翰|
FILE_TABLE
| ID|个人ID|文件名称|
| --|--|--|
| 1 | 1 | 1.xml |
| 2 | 1 | 2.xml |
| 3 | 2 | 3.xml |
尝试-加入并获取下一个
select *
from (select *
from person_table person,
file_table file
where person.id = file.person_id)
offset 0 rows fetch next 2 rows only;
结果:这不起作用,因为Eric有两个文件,所以这将只返回包含Eric的行。
解决方法尝试-listag
通过使用listagg,我可以将所需的FILE_TABLE行 concatinate 到PERSON_TABLE行中,但我不认为它看起来很优雅。
有没有其他明显的方法来做到这一点,我错过了?
1条答案
按热度按时间qfe3c7zg1#
使用子查询筛选人员,然后加入。如果您想要每个人都至少有一个文件的行:
或者,使用解析函数:
其中,对于样本数据:
两者都输出前两个人的文件:
| ID|名称|文件名称|个人ID|
| --|--|--|--|
| 1 |爱丽丝|一| 1 |
| 1 |爱丽丝|B| 1 |
| 1 |爱丽丝|C| 1 |
| 3 |卡罗尔|D| 3 |
如果你还想过滤每个人的文件数量,那么使用
LATERAL
连接并在横向连接内过滤:或者,再用解析函数:
两者输出:
| ID|名称|文件名称|个人ID|
| --|--|--|--|
| 1 |爱丽丝|一| 1 |
| 1 |爱丽丝|B| 1 |
| 3 |卡罗尔|D| 3 |
如果你想得到前两个人,不管他们有零个还是多个文件,那么使用
OUTER JOIN
:或:
其输出:
| ID|名称|文件名称|个人ID|
| --|--|--|--|
| 1 |爱丽丝|一| 1 |
| 1 |爱丽丝|B| 1 |
| 1 |爱丽丝|C| 1 |
| 2 |贝蒂| * 空 | 空 *|
而且,如果你想过滤每个人的文件,那么再一次使用
LATERAL
连接:或:
| ID|名称|文件名称|个人ID|
| --|--|--|--|
| 1 |爱丽丝|一| 1 |
| 1 |爱丽丝|B| 1 |
| 2 |贝蒂| * 空 | 空 *|
fiddle