对用first_name 来join两个表来得到正确结果的疑问

对于employees表中,给出奇数行的first_name

http://www.nowcoder.com/questionTerminal/e3cf1171f6cc426bac85fd4ffa786594

起初我的问题和大家一样,也是用ROW_NUMBER function直接得出结果,结果出来时排序的,题目要求原来顺序一脸懵逼。
想了想是不是可以把ROW_NUMBER放条件里

SELECT first_name
FROM employees
WHERE EXISTS (
    SELECT first_name        
    FROM employees            
    WHERE ROW_NUMBER()OVER(ORDER BY first_name)%2 = 1) 

结果还是不行,ROW_NUMBER function 不能出现在条件里面,要想筛选必须要创建新表(如果错误纠正我)

然后想了想如果不排序,只能用IN或者EXISTS,无疑需要多创建一个表,显得很冗杂。

于是乎去看了看其他人的答案,发现一些确实很简单,很快的就得出了正确答案。但是仔细看了看之后发现,确实感觉有一点不妥。
题目里的primary key是emp_no,如果join的话,首先考虑primary key,但是很多人答案里是用first_name来join两个表。虽然也能得出正确答案,但是如果题目中first_name 不是unique的话,结果肯定会出错,这种解法仅限于这道题,实际生活中肯定会有first_name重复的情况。
个人感觉只能用IN和EXISTS,不用用first_name去join两个表。

EXISTS

SELECT e.first_name
FROM employees e
WHERE EXISTS ( 
    SELECT t.first_name
    FROM (
        SELECT first_name, emp_no,
        ROW_NUMBER()OVER(ORDER BY first_name) AS flag
        FROM employees) AS t
    WHERE t.emp_no = e.emp_no
    AND t.flag%2 = 1)

跟IN得不同是, 条件里需要join两个表

IN

SELECT e.first_name
FROM employees e
WHERE e.first_name IN (
    SELECT t.first_name
    FROM (
        SELECT first_name, emp_no,
        ROW_NUMBER()OVER(ORDER BY first_name) AS flag
        FROM employees) AS t
    WHERE t.flag%2 = 1)

都是需要创建两个表

全部评论
我觉得就算是first_name有重复的情况下用first_name链接也不会影响什么吧,输出结果应该是一样的。
点赞 回复 分享
发布于 2021-07-19 10:40
我也是这样 很奇怪
点赞 回复 分享
发布于 2021-05-11 17:25
select employees.first_name from employees join (select emp_no,first_name,dense_rank() over(order by first_name ) rk from employees ) t on employees.emp_no=t.emp_no where mod(t.rk,2)=1; 我的连接条件用的emp_no,但是为什么通过不了呢?
点赞 回复 分享
发布于 2021-04-06 16:31

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
18
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务