对用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)
都是需要创建两个表