2017-01-12 6 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関係をUSERCLASSの間にマッピングすることです。INNER JOINとINの組み合わせ:Oracle Sql

特定のクラスに属するすべてのユーザーのすべての詳細を送信する必要があります。私は以下のような非作業コードを持っています。何が間違っているのか、それを達成するための他の効率的な方法がありますか?

私は複数のテーブルの上に内部結合のために(SQL Inner-join with 3 tables?)を参照していますが、ここでの問題ではなく、与えられた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, [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) 

結果:USERは私が使用理由です、予約語であることを

user1 rob [email protected] 
user2 bob [email protected] 

をお知らせ二重引用符。オブジェクトに名前を付けるために予約語を使用しない方が良いでしょう。

+0

完璧に動作します!ありがとう! –

+0

テーブル名は例で与えられたものと異なりますが、それらははるかに大きくなっています。しかし、それを指摘してくれてありがとう! –

関連する問題