簡體   English   中英

SQL 子查詢座位交換

[英]SQL Sub queries Seat Exchange

我試圖了解這個子查詢是如何工作的。 問題如下

Mary是一所中學的老師,她有一個桌子座位,里面存放着學生的名字和他們對應的座位id。列id是連續遞增的。 瑪麗想為相鄰的學生換座位。

 SELECT
(CASE
    WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
    WHEN MOD(id, 2) != 0 AND counts = id THEN id
    ELSE id - 1
END) AS id,
student
FROM
seat,
(SELECT
    COUNT(*) AS counts
FROM
    seat) AS seat_counts
ORDER BY id ASC;

我試圖了解上述查詢的工作原理。 因此,在 CASE 中,它檢查 id 是奇數還是偶數,並檢查計數以查看它是否是最后一個元素。 但是 ORDER BY ASC 是如何工作的呢? 因為它第一次選擇了學生 Dorris 和 id 2。但是如何將 id 2 分配給 Abbot。 謝謝。

SQL表

id   | student 

1    | Abbot   
2    | Doris   
3    | Emerson
4    | Green   
5    | Jeames  

結果看起來像

id   | student

1    | Dorris
2    | Abbot 
3    | Green 
4    | Emerson
5    | Jeames

好的,這是做什么的 - 如果一個 id 號是奇數並且它不是最大數字,則向其添加 1,否則從中減去 1。

應該很清楚,除了最后一對之外,其他所有東西都會交換。

我認為它寫得不好我會這樣寫:

WITH student_count(max) as
(
   SELECT COUNT(*) FROM  seat
)
SELECT
  CASE
    WHEN student_count.max != id AND MOD(id, 2) != 0 THEN id + 1 
    WHEN student_count.max != id AND MOD(id, 2) = 0 THEN id - 1 
    ELSE id
  END AS id,
  student
FROM seat
CROSS JOIN student_count
ORDER BY id ASC;

我建議您通過刪除 ORDER BY 語句來檢查結果。 當您刪除 ORDER BY 語句時,結果將是:

2   Abbot
1   Doris
4   Emerson
3   Green
5   Jeames

這完全適合您的情況。 基本上,您的查詢只是根據 CASE 語句更改 id 的值。 當您添加 ORDER BY id ASC 語句時,它只會對上面的結果進行排序。

select name, case when mod(seat_id,2) = 1 and seat_id <> (select max(seat_id) from students) then seat_id + 1 when mod(seat_id,2)= 0 then seat_id - 1 when mod(seat_id,2) = 1 and seat_id = (select max(seat_id) from students) then seat_id end swap from students

SELECT (CASE WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1 WHEN MOD(id, 2) != 0 AND counts = id THEN id ELSE id - 1 END) AS id, student FROM Seat , (SELECT COUNT(*) AS counts FROM Seat) AS Seat_counts ORDER BY id ASC;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM