有没有办法通过 WHERE IN 语句将嵌套子查询中的别名列名传递给 UPDATE 语句?
Is there a way to pass an alias column name in a nested sub-query, via WHERE IN statement, to the UPDATE statement?
我遇到了这个 -
Using ALIAS column in WHERE 最近,我明白了为什么 WHERE 子句给我一个错误,但我似乎无法想出任何其他方式来编写我的嵌套查询。 SELECT 子查询本身运行完全正常。
错误如下:
Error Code: 1054. Unknown column 'actual_start_time' in 'IN/ALL/ANY subquery'
Table Structure:
Students: student_id student_name login_time logout_time
Tests: 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);
这似乎是您想要的:
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)
);
我遇到了这个 - Using ALIAS column in WHERE 最近,我明白了为什么 WHERE 子句给我一个错误,但我似乎无法想出任何其他方式来编写我的嵌套查询。 SELECT 子查询本身运行完全正常。
错误如下:
Error Code: 1054. Unknown column 'actual_start_time' in 'IN/ALL/ANY subquery'
Table Structure:
Students: student_id student_name login_time logout_time
Tests: 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);
这似乎是您想要的:
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)
);