@(一隻心中無碼的程序員)專欄程序員
- ~
題目描述
對於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