2017-01-12 2 views
1

У меня есть 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 в основном сопоставляет отношение MANY-MANY между USER и CLASS.Сочетание INNER JOIN и IN: Oracle Sql

Необходимо отправить все детали всех пользователей, принадлежащих к определенному классу. У меня есть нерабочий код ниже: любая идея, что я могу делать неправильно, или есть ли другой эффективный способ добиться того же?

Я имею в виду (SQL Inner-join with 3 tables?) для INNER JOIN через несколько таблиц, но здесь проблема в том, что вместо одного пользователя с заданным class_id, я получаю список USER_ID от USER_CLASS_MAP.

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, [email protected]) 
(id2, user2, [email protected]) 

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 protected]}, 
    {USER_ID=user2, NAME=bob, [email protected]} 
] 
+0

Как ID может быть списком? – Jens

+4

Это было бы заметно улучшено, если бы вы добавили некоторые * выборочные данные * для каждой таблицы и ваши * ожидаемые результаты *. –

+1

Добавить пример данных таблицы и ожидаемого результата. (Также форматированный текст.) – jarlh

ответ

2

Ваши данные выборки:

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', '[email protected]' from dual union all 
    select 'id2', 'user2', '[email protected]' 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 [email protected] 
user2 bob [email protected] 

Обратите внимание, что USER является зарезервированным словом, именно поэтому я использовал двойные кавычки; было бы лучше не использовать зарезервированные слова для обозначения объектов.

+0

Прекрасно работает! Благодаря! –

+0

Названия таблиц отличаются от тех, которые приведены в примере, они намного больше, поэтому дала явно упрощенную версию. Но спасибо, что указали! –