Oracle Sql 连接两个表

Posted

技术标签:

【中文标题】Oracle Sql 连接两个表【英文标题】:Oracle Sql join two tables 【发布时间】:2020-05-23 19:34:32 【问题描述】:

我有一个连接两个表的查询。

RESULT_TABLE:  
ID, TEST_RESULT , TEST_STATUS

EMAIL_TABLE:  
ID, EMAIL_TYPE, EMAIL_ADDRESS

RESULT_TABLE 通常每个学生只有一个结果。学生通常在 EMAIL_TABLE 中有两个电子邮件地址,一个是“个人”类型,一个是“学生”类型。 我需要一个查询,将学生的结果和两个电子邮件地址连接成一行。

我的查询使用 EMAIL_TABLE 的两个实例来执行此操作:

select r.id, r.result, e1.email_address "PERSONAL", e2.email_address "STUDENT"  
from   result_table r, email_table e1, email_table e2 
where  r.test_status = 'graded' 
and    e1.id = r.id  
and    e2.id = r.id  
and    e1.email_type ='Personal'  
and    e2.email_type = 'Student'

示例结果:

ID      RESULT   PERSONAL                    STUDENT          
------- -------- --------------------------- ------------------------- 
12345   A        me@personalemail.com        ima@studentemail.edu    
12222   B        number2@anotheremail.com    youra@studentemail.edu  

此查询在大多数情况下都有效,可显示学生的结果和两种类型的电子邮件地址。

问题是,如果 email_table 中缺少其中一个 email_types,则找不到整个结果。即使 email_table 中不存在一个或两个电子邮件地址,我也需要它为每个学生显示结果。

进行此连接的正确方法是什么?

【问题讨论】:

请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。隔离第一个错误的子表达式及其输入和输出。 (调试基础。) 这是一个常见问题解答。在考虑发布之前,请阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 【参考方案1】:

学习使用正确、明确、标准、可读的JOIN语法!

你可以使用两个left joins:

select r.id, r.result, ep.email_address as personal, e2.email_address as student
from result_table r left join
     email_table ep
     on ep.id = r.id and ep.email_type ='Personal' left join
     email_table et2
     on es.id = r.id and es.email_type = 'Student'

【讨论】:

以上是关于Oracle Sql 连接两个表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle_SQL 连接和子查询

oracle数据库的连接

连接两个以上的表时,Oracle 连接消除无法按预期工作

Oracle查询出两个字段连接成一个字段..中间有符号隔开

oracle 表连接 - hash join 哈希连接

SQL内连接与外连接的区别