#mysql #sql
Вопрос:
Давайте предположим
«Мэри-учительница в средней школе, и у нее есть место за столом, где хранятся имена учеников и их соответствующие удостоверения личности. Идентификатор столбца является непрерывным приращением. Мэри хочет пересесть на соседние места для студентов.’
Примерная таблица выглядит следующим образом:
--------- ---------
| id | student |
--------- ---------
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
--------- ---------
Мэри хочет переключить соседнего ученика, результат выглядит так:
--------- ---------
| id | student |
--------- ---------
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
--------- ---------
Я придумал решение, используя оператор Case When и Then.
Решение :
SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THEN id
WHEN id%2 = 1 THEN id 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id
Существует ли какой-либо другой простой способ, используя утверждение случая или любой другой подход, с помощью которого мы можем решить эту проблему.
Спасибо
Комментарии:
1. из формулировки проблемы следует, что вы должны обновлять, а не выбирать?
Ответ №1:
Вы можете использовать комбинацию самостоятельного соединения с помощью LEFT JOIN
CASE WHEN
и COALESCE
в качестве альтернативы.
select s1.id, coalesce(s2.student,s1.student)
from sample s1
left join sample s2
on s1.id case when s1.id%2=1 then 1 else -1 end = s2.id
COALESCE
и LEFT JOIN
просто необходимы для ведения учета Jeames
, которые не объединяются с s2
Вы можете протестировать эту скрипку db<>.
Ответ №2:
Вы можете использовать lead()
и first_value()
:
select id,
coalesce(lead(student) over (order by id),
first_value(student) over (order by id)
) as student
from t;