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的主要内容,如果未能解决你的问题,请参考以下文章

SQL 子查询

SQl子查询

5. SQL子查询—内嵌的SQL子句

moon 子查询 SQL

sql子查询(急100分)

sql server——子查询