【367天】我爱刷题系列126(2018.02.07)

@(一只心中无码的程序员)专栏程序员

叨叨两句

  1. ~

SQL习题021

1

题目描述
对于employees表中,给出奇数行的first_name
CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));
函数

首先题目的叙述有问题,致使理解有误,输出的数据与参考答案不一样。先给出正确的题目叙述:【对于employees表,在对first_name进行排名后,选出奇数排名对应的first_name】。
一、本题用到了三层 SELECT 查询,为了便于理解,采用缩进方式分层,且最外层对应e1,最内层对应e3;
二、在e3层中,采用 COUNT() 函数对 e2.first_name 进行排名标号,即在给定 e2.first_name的状况下,不大于 e2.first_name 的 e3.first_name 的个数有多少,该个数恰好与 e2.first_name 的排名标号匹配,且将该值命名为 rowid;
/*注意:排名标号后并未排序,即[Bob, Carter, Amy]的排名是[2,3,1],选取奇数排名后输出[Carter, Amy],因此可见参考答案中的first_name并未按字母大小排序*/
三、在e1层中,直接在限定条件 e1.rowid % 2 = 1 下,表明奇数行的 rowid,选取对应的 e1.first_name;
四、e2层则至关于链接e1层(选取表示层)与e3层(标号层)的桥梁。

SELECT e1.first_name FROM 
  (SELECT e2.first_name, 
    (SELECT COUNT(*) FROM employees AS e3 
     WHERE e3.first_name <= e2.first_name) 
   AS rowid FROM employees AS e2) AS e1
WHERE e1.rowid % 2 = 1
相关文章
相关标签/搜索