首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接3个表

连接3个表
EN

Stack Overflow用户
提问于 2016-07-27 21:38:11
回答 3查看 82关注 0票数 2

我有3张桌子学生,STUDENT_GPA,STUDENT_ATTENDANCE如下所示

代码语言:javascript
运行
复制
STUDENT
--------
STUDENT_ID STUDENT_NAME
-----------------------
1          A
2          B
3          C
4          D
5          E

SUBJECTS
--------
STUDENT_ID  GPA UPDATE_FLG
---------------------------
2           8     Y
4           7     Y
5           8     N


STUDENT_ATTENDANCE
------------------
STUDENT_ID  ATTENDANCE  UPDATE_FLG
----------------------------------
3           92           Y


Output should be

STUDENT_ID STUDENT_NAME GPA    ATTENDANCE
--------------------------------------
2           B           8      NULL
3           C           NULL   92
4           D           7      NULL

我尝试了下面的查询,但是它不能正常工作。它缺少任何一个表中的行。

代码语言:javascript
运行
复制
SELECT S.STUDENT_ID,
       S.STUDENT_NAME,
       SD.GPA,
       SA.ATTENDANCE
FROM STUDENT S
LEFT OUTER JOIN STUDENT_GPA SD ON (S.STUDENT_ID=SD.STUDENT_ID
                                   AND SD.UPDATE_FLG='Y')
LEFT OUTER JOIN STUDENT_ATTENDANCE SA ON (S.STUDENT_ID=SA.STUDENT_ID
                                          AND SA.UPDATE_FLG='Y')

请帮帮我!谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-27 22:18:28

虽然,从你的问题中并不十分清楚,你需要什么结果集,然而,看起来你想为那些GPA被更新或其出勤率被更新的学生选择数据,而你想忽略所有其他记录。

基于这种理解,下面的查询为您提供了预期的结果集。

代码语言:javascript
运行
复制
SELECT S.STUDENT_ID, S.STUDENT_NAME, SD.GPA, SA.ATTENDANCE 
FROM STUDENT S LEFT OUTER JOIN STUDENT_GPA SD ON 
(S.STUDENT_ID=SD.STUDENT_ID)
LEFT OUTER JOIN STUDENT_ATTENDANCE SA ON (S.STUDENT_ID=SA.STUDENT_ID)
WHERE SA.UPDATE_FLG = 'Y' OR SD.UPDATE_FLG = 'Y'
票数 1
EN

Stack Overflow用户

发布于 2016-07-27 21:54:02

代码语言:javascript
运行
复制
SELECT S.STUDENT_ID,
       S.STUDENT_NAME,
       SD.GPA,
       SA.ATTENDANCE
FROM STUDENT S
LEFT OUTER JOIN STUDENT_GPA SD ON (S.STUDENT_ID=SD.STUDENT_ID
                                   AND SD.UPDATE_FLG='Y')
LEFT OUTER JOIN STUDENT_ATTENDANCE SA ON (S.STUDENT_ID=SA.STUDENT_ID
                                          AND SA.UPDATE_FLG='Y')
UNION
SELECT S.STUDENT_ID,
       S.STUDENT_NAME,
       SD.GPA,
       SA.ATTENDANCE
FROM STUDENT S
RIGHT OUTER JOIN STUDENT_GPA SD ON (S.STUDENT_ID=SD.STUDENT_ID
                                    AND SD.UPDATE_FLG='Y')
RIGHT OUTER JOIN STUDENT_ATTENDANCE SA ON (S.STUDENT_ID=SA.STUDENT_ID
                                           AND SA.UPDATE_FLG='Y')
票数 0
EN

Stack Overflow用户

发布于 2016-07-27 22:01:51

这里有一个使用conditional aggregation的选项

代码语言:javascript
运行
复制
select *
from (
  select s.student_id, s.student_name,
    max(case when sub.update_flag = 'Y' then sub.gpa end) gpa,
    max(case when att.update_flag = 'Y' then att.attendance end) attendance
  from student s 
    left join subjects sub on s.student_id = sub.student_id 
    left join student_attendance att on s.student_id = att.student_id
  group by s.student_id, s.student_name
  ) t
where gpa is not null or attendance is not null
  • SQL Fiddle演示
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38623632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档