Oracle多表查询需求:基于members_tbl的request_id获取成员所属组及全组成员信息
Oracle查询:基于request_id关联成员与所属组并展示组内所有用户
针对你的需求,我们可以通过多表关联的方式实现:先定位request_id对应的成员,再关联到他们所属的组,最后拉取该组内的所有用户。下面是具体的查询方案:
核心查询语句
如果要查询指定request_id(比如123)对应的组及组内用户,可以用这个语句:
SELECT DISTINCT g.group_type, u.email FROM members_tbl m JOIN users_tbl u1 ON m.email = u1.email JOIN groups_tbl g ON u1.user_id = g.user_id JOIN users_tbl u ON g.user_id = u.user_id WHERE m.request_id = 123;
如果需要一次性查询所有request_id对应的结果(包含request_id字段),可以调整为:
SELECT DISTINCT m.request_id, g.group_type, u.email FROM members_tbl m JOIN users_tbl u1 ON m.email = u1.email JOIN groups_tbl g ON u1.user_id = g.user_id JOIN users_tbl u ON g.user_id = u.user_id ORDER BY m.request_id, g.group_type;
逻辑拆解
- 关联成员与基础用户信息:通过
members_tbl.email和users_tbl.email匹配,拿到该request_id下所有成员的user_id - 定位成员所属组:用成员的
user_id关联groups_tbl,获取对应的group_type和组关联关系 - 拉取组内所有用户:再次连接
users_tbl,通过组的user_id关联,拿到该组下的全部用户邮箱 - 去重处理:因为同一个组可能被多个成员关联到,用
DISTINCT避免重复输出相同的组-用户记录
测试结果验证
用你提供的测试数据执行第一个查询(指定request_id=123),会得到预期结果:
| group_type | |
|---|---|
| A | mike@yahoo.com |
| A | sam@yahoo.com |
| B | peter@yahoo.com |
附:表结构与测试数据
为方便参考,这里整理你提供的表创建和插入语句:
users_tbl
CREATE TABLE users_tbl ( user_id NUMBER, email VARCHAR2(100) ); INSERT INTO users_tbl VALUES(1, 'mike@yahoo.com'); INSERT INTO users_tbl VALUES(2, 'sam@yahoo.com'); INSERT INTO users_tbl VALUES(3, 'peter@yahoo.com');
members_tbl
CREATE TABLE members_tbl ( member_id NUMBER, request_id NUMBER, email VARCHAR2(100) ); INSERT INTO members_tbl VALUES(1, 123, 'mike@yahoo.com'); INSERT INTO members_tbl VALUES(2, 123, 'peter@yahoo.com');
groups_tbl
CREATE TABLE groups_tbl ( group_id NUMBER, group_type VARCHAR2(10), user_id NUMBER ); INSERT INTO groups_tbl VALUES (1, 'A', 1); INSERT INTO groups_tbl VALUES (2, 'A', 2); INSERT INTO groups_tbl VALUES (3, 'B', 3);
内容的提问来源于stack exchange,提问作者IceTea
相关产品推荐
相关产品推荐

