4

有以下问题

INSERT INTO statistics_new (SELECT * FROM statistics)
    -> 
    -> ON DUPLICATE KEY UPDATE
    -> 
    -> end_date = IF(end_date < VALUES(end_date), VALUES(end_date), end_date);
ERROR 1052 (23000): Column 'end_date' in field list is ambiguous

当我尝试按照http://dev.mysql.com/doc/refman/5.0/en/insert-select.html中的建议指定列和表别名时,我得到了相同的结果。

服务器版本:5.5.24-0ubuntu0.12.04.1(Ubuntu)

以下查询运行没有问题:

INSERT INTO statistics_new (SELECT * FROM statistics)
ON DUPLICATE KEY UPDATE
end_date = VALUES(end_date)
4

4 回答 4

11

SQLFiddle 示例

基本上我认为你想要这个:

INSERT INTO statistics_new (SELECT * FROM statistics)
ON DUPLICATE KEY UPDATE
statistics_new.end_date = if(statistics_new.end_date < statistics.end_date, 
                             statistics.end_date, statistics_new.end_date);
于 2012-11-07T09:58:33.727 回答
1

两者statistics_new都有statisticsend_date。请在您的 SQL 中区分它们。

于 2012-11-07T09:56:51.943 回答
0

如果您尝试在最后一行设置一个变量,它应该类似于:

SET @end_date = IF(end_date < VALUES(end_date), VALUES(end_date), end_date);
于 2012-11-07T09:57:58.823 回答
0

如果您不想创建新表,可以使用子查询来重命名不明确的字段。这需要列出所有字段,因此可能不适合所有用例:

INSERT INTO statistics(end_date, field2) 
SELECT * FROM (
  SELECT end_date as new_end_date, field2 
  FROM statistics
) q
ON DUPLICATE KEY UPDATE
  end_date = IF(end_date < VALUES(end_date), VALUES(end_date), end_date);
于 2021-11-03T08:32:12.303 回答