INNER JOIN和IN的结合:Oracle Sql
Posted
技术标签:
【中文标题】INNER JOIN和IN的结合:Oracle Sql【英文标题】:Combination of INNER JOIN and IN :Oracle Sql 【发布时间】:2017-05-27 15:41:39 【问题描述】:我有 4 张桌子,USER(ID, USER_ID, NAME), USER_2(ID, USER_ID, EMAIL)
和 USER_CLASS_MAP(ID, USER_ID, CLASS_ID)
和 CLASS(ID, NAME)
。 USER_CLASS_MAP
基本上是映射USER
和CLASS
之间的MANY-MANY 关系。
需要发送属于特定类的所有用户的所有详细信息。我有如下非工作代码 - 知道我可能做错了什么,或者有没有其他有效的方法来实现同样的目标?
我指的是 (SQL Inner-join with 3 tables?) 在多个表上进行 INNER JOIN,但这里的问题是,我不是针对给定 CLASS_ID 的单个用户,而是从 USER_CLASS_MAP
获得 USER_ID
的列表。
SELECT USER_ID from USER_CLASS_MAP where CLASS_ID=:classID
这是我目前拥有的:
SELECT USER1.NAME, USER2.EMAIL
INNER JOIN CLASS_USER_MAP as cmap
ON cmap.USER_ID = USER1.ID
INNER JOIN CLASS_USER_MAP as cmap
ON cmap.USER_ID = USER2.ID
这里的问题是 .ID 基本上是一个列表!
EXAMPLE:
USER:
(id1, user1, rob)
(id2, user2, bob)
USER_2:
(id1, user1, rob@something.something)
(id2, user2, bob@something.something)
USER_CLASS_MAP:
(id1, user1, class1)
(id2, user2, class1)
CLASS:
(class1, Biology)
(class2, Chemistry)
Given:
Get all User Details for class with classId = class1
Output:
[
USER_ID=user1, NAME=rob, EMAIL=rob@something.something,
USER_ID=user2, NAME=bob, EMAIL=bob@something.something
]
【问题讨论】:
一个ID怎么可能是一个列表? 如果您为每个表和您的预期结果添加一些样本数据,这将得到显着改善。 添加一些示例表数据和预期结果。 (以及格式化文本。) 基本上我从运行第一个查询中得到一个 USER_ID 列表(因为它是多对多映射),所以第二个查询中的 ID 必须来自这个列表。 还是不清楚。请尝试为您的表构建一个包含一些示例数据的小示例,然后发布您需要从查询中获得的结果,甚至解释结果背后的逻辑。 【参考方案1】:您的样本数据:
create table "USER"(ID, USER_ID, NAME) as (
select 'id1', 'user1', 'rob' from dual union all
select 'id2', 'user2', 'bob' from dual
);
create table USER_2(ID, USER_ID, EMAIL) as (
select 'id1', 'user1', 'rob@something.something' from dual union all
select 'id2', 'user2', 'bob@something.something' from dual
);
create table USER_CLASS_MAP(ID, USER_ID, CLASS_ID) as (
select 'id1', 'user1', 'class1' from dual union all
select 'id2', 'user2', 'class1' from dual
);
create table CLASS(ID, NAME) as (
select 'class1', 'Biology' from dual union all
select 'class2', 'Chemistry' from dual
);
查询:
select u.user_id, u.name, email
from class c
inner join USER_CLASS_MAP uc
on ( uc.class_id = c.id)
inner join "USER" u
on ( uc.user_id = u.user_id)
inner join USER_2 u2
on ( u2.user_id = u.user_id)
结果:
user1 rob rob@something.something
user2 bob bob@something.something
注意USER
是保留字,这就是我使用双引号的原因;最好不要使用保留字来命名对象。
【讨论】:
完美运行!谢谢! 表名与示例中给出的不同,它们要大得多——所以给出了一个明显简化的版本。但感谢您指出!以上是关于INNER JOIN和IN的结合:Oracle Sql的主要内容,如果未能解决你的问题,请参考以下文章
Inner Join and Left Join 与条件的结合
Inner Join and Left Join 与条件的结合