Значения строк в SQL Exchange - PullRequest
0 голосов
/ 31 мая 2018

Это вопрос об обмене мест из leetcode .

Учитель хочет поменять место для соседних учеников.Входные данные:

+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Abbot   |
|    2    | Doris   |
|    3    | Emerson |
|    4    | Green   |
|    5    | Jeames  |
+---------+---------+

Выходные данные:

+---------+---------+
|    id   | student |
+---------+---------+
|    1    | Doris   |
|    2    | Abbot   |
|    3    | Green   |
|    4    | Emerson |
|    5    | Jeames  |
+---------+---------+

Данное решение:

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;

Мое решение:

select 
(Case 
    when mod(id,2) !=0 and id != count(*) then id + 1
    when mod(id,2) !=0 and id = count(*) then id
    else id - 1
 end) as 'id',
 student
from seat
order by id;

Данное решение работаеточень хорошо, но мой может получить только одну строку вывода.

Мой вывод:

+---------+---------+
|    id   | student |
+---------+---------+
|    2    | Abbot   |
+---------+---------+

Может кто-нибудь объяснить, в чем разница между моим решением и данным решением и почему мое решение неверно?Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

При использовании количества () непосредственно в запросе у вас всегда будет одна строка.Другое решение использует счетчик () в качестве значения для всего запроса, используя подзапрос.

Попробуйте

SELECT id, count(*) FROM seat

и

SELECT id, (SELECT COUNT(*) FROM seat) FROM seat

и наблюдайте разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...