Есть ли способ передать имя столбца псевдонима во вложенном подзапросе с помощью оператора WHERE IN в оператор UPDATE? - PullRequest
0 голосов
/ 05 марта 2019

я сталкивался с этим - Использование столбца ALIAS в WHERE в последнее время, и я понимаю, почему предложение WHERE дает мне ошибку, но я не могу найти какой-либо другой способ написать мой вложенный запрос. Подзапрос SELECT выполняется полностью сам по себе.

Ошибка выглядит следующим образом:

Error Code: 1054. Unknown column 'actual_start_time' in 'IN/ALL/ANY subquery'

Структура таблицы:

Студенты: идентификатор студента имя студента login_time logout_time

Тесты: test_id test_start_time test_end_time

TestStats: test_id student_id test_duration

UPDATE test_stats
SET test_duration = datediff(hour, actual_start_time - actual_end_time)
WHERE (actual_start_time, actual_end_time)
IN (
SELECT
CASE
WHEN (s.login_time > t.test_start_time) THEN s.login_time
ELSE t.test_start_time
END AS actual_start_time,
CASE
WHEN (s.logout_time < t.test_end_time) THEN s.logout_time
ELSE t.test_end_time
END AS actual_end_time
FROM tests AS t, students AS s, test_stats AS ts
WHERE t.test_id = ts.test_id and s.student_id = ts.student_id);

1 Ответ

1 голос
/ 05 марта 2019

Похоже, что вы хотите:

UPDATE test_stats ts JOIN
       tests t
       ON t.test_id = ts.test_id  JOIN
       students s
       ON s.student_id = ts.student_id
SET test_duration = timestampdiff(hour,
                                  GREATEST(s.login_time, t.test_start_time),
                                  LEAST(s.logout_time, t.test_end_time)
                                 );
...