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

Query to join two tables by mapping third table without returning all records from third table in Oracle

我有 3 个 table:

Table Maths:

ID   Marks1
(1 ,    80)

Table English:

ID   Marks2
(2 ,    85)

Table 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

但是这个查询 returns 来自 Student table 的所有记录,我不需要。 我只需要数学和英语 tables 的记录。 请帮我解决这个问题。

只需将您的 FULL JOIN(完全外部联接 - returns 记录当 table 中有行时)更改为 JOIN(内部联接 - 仅联接当行同时存在于 tables)

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

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 关于联接的信息。