查询通过映射第三个表来连接两个表,而不返回Oracle中第三个表的所有记录

时间:2015-06-08 15:45:25

标签: sql oracle join left-join

我有3张桌子:

Maths

ID   Marks1
(1 ,    80)

English

ID   Marks2
(2 ,    85)

Student

ID    Name
(1 ,    Raj)
(2 ,    Sam)
(3 ,    John)

我需要一个SQL查询(Oracle)来获得以下输出:

ID Name Marks1 Marks2
(1 , Raj , 80 ,    (null))
(2 , Sam , (null) , 85)

我写的一些查询:

select B.ID, B.Name, A.Marks1, C.Marks2 from 
(select ID, Marks1 from Maths) A
full join Student B on B.ID=A.ID
left join (select ID, Marks2 from English) C
on C.ID=B.ID

但是这个查询会返回Student表中我不需要的所有记录。 我只需要数学和英语表格的记录。 请帮帮我。

2 个答案:

答案 0 :(得分:0)

只需将FULL JOIN(完全外部联接 - 在任一表中有行时返回记录)更改为JOIN(内部联接 - 只有在两个表中存在行时才加入)

答案 1 :(得分:0)

您需要行,其中学生的ID至少存在于MATHSENGLISH个表中。这些查询提供了您想要的输出:

select id, s.name, m.Marks1, e.Marks2 
  from maths m 
    full join english e using (id)
    join student s using (id);

...或:

select s.id, s.name, m.Marks1, e.Marks2 
  from student s
    left join english e on e.id=s.id
    left join maths m on m.id = s.id
  where e.id is not null or m.id is not null

SQLFiddle demo

在第一个查询连接表的顺序很重要 - 这就是输出不正确的原因。关于联接的更多informations with examples