【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
相關文章
相關標籤/搜索