SQL 子查询 Seat Exchange
Posted
技术标签:
【中文标题】SQL 子查询 Seat Exchange【英文标题】:SQL Sub queries Seat Exchange 【发布时间】:2018-07-19 11:25:54 【问题描述】:我试图了解这个子查询是如何工作的。问题如下
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
【问题讨论】:
使用正确的JOIN
。它已经存在了 20 多年了!!!
我知道有很多方法可以做到这一点。但是你能解释一下查询是如何工作的,尤其是 id 是如何切换的吗?
【参考方案1】:
好的,它的作用如下 - 如果一个 id 编号是奇数并且它不是最大编号,则将其加一,否则将其减一。
应该很清楚,除了最后一对之外,这将交换所有内容。
我觉得写得不好我会这样写:
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;
【讨论】:
【参考方案2】:我建议您通过删除 ORDER BY 语句来检查结果。当您删除 ORDER BY 语句时,结果将是:
2 Abbot
1 Doris
4 Emerson
3 Green
5 Jeames
这完全适合您的情况。基本上,您的查询只是根据 CASE 语句更改 id 的值。当您添加 ORDER BY id ASC 语句时,它只是对上面的结果进行排序。
【讨论】:
如果您没有订单,则可以保证这是订单(结果始终相同,只是行的顺序未知。)【参考方案3】: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
【讨论】:
这是我能找到的最好的方法。让我知道是否有帮助 感谢您的回答。以后最好使用代码块,让你的代码更清晰。【参考方案4】: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;
【讨论】:
以上是关于SQL 子查询 Seat Exchange的主要内容,如果未能解决你的问题,请参考以下文章