Обмен местами (SQL через код доступа)

#mysql

Вопрос:

Вопрос:

  ------------- ---------  | Column Name | Type |  ------------- ---------  | id | int | | name | varchar |  ------------- ---------   

идентификатор-это столбец первичного ключа для этой таблицы. В каждой строке этой таблицы указаны имя и идентификатор учащегося. идентификатор-это непрерывное приращение.

Может ли кто-нибудь, пожалуйста, объяснить мне цель «id = (выберите max(id) с места)» в следующем коде?

 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  

Разве для этого вопроса не должно быть достаточно следующего?

 select (CASE when (select max(id) from seat)%2 = 1 then id when id%2 = 1 then id 1 else id -1 end) as id,student from seat order by id  

Комментарии:

1. Достаточно для какого вопроса? Что это должно сделать?

Ответ №1:

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

Если есть четное количество строк, это не проблема, вы добавляете 1 к нечетному идентификатору и вычитаете из четного идентификатора.

Но если строк нечетное количество, вам придется специально обработать последнюю строку, потому что следующей строки для обмена идентификаторами нет. Все остальные строки меняются местами, как и в четном случае.

В вашей версии запроса, если имеется нечетное количество строк, вы не меняете местами идентификаторы, потому что вы не проверяете, является ли текущая строка последней строкой, которую следует рассматривать специально.

Вот что AND id = (select MAX(id) FROM seat) проверяет.

Комментарии:

1. Но разве макс в «(выберите макс(идентификатор) с места)%2 = 1» не проверяет наличие последней строки?

2. Нет, это проверка, не является ли идентификатор последней строки нечетным.