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 基本上是映射USERCLASS 之间的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的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中Inner join和Where的区别

join和left join的区别

Inner Join and Left Join 与条件的结合

Inner Join and Left Join 与条件的结合

在SQL联表查询的时候,in和inner join各有啥优点?

mysql 里面JOIN 和 INNER JOIN 区别是啥