首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择两个表之间的最高记录

选择两个表之间的最高记录
EN

Stack Overflow用户
提问于 2017-11-07 18:54:28
回答 4查看 47关注 0票数 0

我有两张桌子。一个表包含毕业记录,第二个表包含毕业后记录。应聘者必须毕业,但不一定要毕业后。

我的问题是,如果应聘者有岗位毕业记录,则选择岗位毕业记录,否则只有毕业记录。

表1 graduation_table

代码语言:javascript
复制
rollno | degree | division
--------------------------
001    | B.tech | 1st
002    | B.sc   | 1st
003    | BA     | 1st

表2 postgraduation_table

代码语言:javascript
复制
rollno | degree | division
--------------------------
002    | M.sc   | 1st

结果必须为

代码语言:javascript
复制
rollno | degree | division
--------------------------
001    | B.tech | 1st
002    | M.sc   | 1st
003    | BA     | 1st
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-07 19:03:07

您需要graduation_table中没有postgraduation_table行的所有行以及postgraduation_table中的行。这可以用not existsunion查询来表示:

代码语言:javascript
复制
select gt.rollno, gt.degree, gt.division
from graduation_table gt
where not exists (select * 
                  from postgraduation_table pg
                  where pg.rollno = gt.rollno)

union all

select rollno, degree, division
from postgraduation_table
order by rollno;

在线示例:http://rextester.com/IFCQR67320

票数 1
EN

Stack Overflow用户

发布于 2017-11-07 19:02:08

代码语言:javascript
复制
select
    rollno,
    case when p.degree is null then g.degree else p.degree end as degree,
    case when p.division is null then g.division else p.division end as division
from
    grad g
    left join
    post p using (rollno)

或者像评论中建议的那样更好:

代码语言:javascript
复制
select
    rollno,
    coalesce (p.degree, g.degree) as degree,
    coalesce (p.division, g.division) as division
from
    grad g
    left join
    post p using (rollno)
票数 1
EN

Stack Overflow用户

发布于 2017-11-07 18:58:26

将这两个表合并,并引入一个position列,以对这两个表的相对重要性进行排名。研究生表的pos值为1,研究生表的值为2。然后,对此联合查询应用ROW_NUMBER(),并为每个rollno记录组分配一个行号(假定为一条或最多两条记录)。最后,再执行一个外部子查询以保留最重要的记录,首先是研究生,其次是研究生。

代码语言:javascript
复制
SELECT rollno, degree, division
FROM
(
    SELECT
        rollno, degree, division,
        ROW_NUMBER() OVER (PARTITION BY rollno ORDER BY pos) rn
    FROM
    (
        SELECT p.*, 1 AS pos p FROM postgraduation_table
        UNION ALL
        SELECT p.*, 2 FROM graduation_table p
    ) t
) t
WHERE t.rn = 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47156122

复制
相关文章

相似问题

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