【问题标题】:Error: Every derived table must have its own alias [duplicate]错误:每个派生表都必须有自己的别名 [重复]
【发布时间】:2013-08-28 23:29:06
【问题描述】:
UPDATE `FlightSchedule`
SET delay=(
  SELECT *
  FROM (
    SELECT
      MINUTE(ETA - STA)
    FROM `FlightSchedule`
      WHERE `flightNum_arr` = '3517'
  )
)
WHERE `flightNum_arr` = '3517';

说:

“每个派生表都必须有自己的别名”。

如何解决这个问题?

【问题讨论】:

    标签: php mysql sql datediff


    【解决方案1】:

    修复它 - 就像您在错误消息中显示的那样:

    UPDATE `FlightSchedule` 
    SET delay=
    (SELECT update_field
     FROM 
     (
      SELECT MINUTE (ETA - STA) AS update_field
      FROM `FlightSchedule` 
      WHERE `flightNum_arr`='3517'
     ) AS internal_0
    )
    WHERE `flightNum_arr`='3517';
    

    但实际上上面有更正确的建议 - 完全摆脱嵌套子查询(请参阅 Gordon 的回答)。

    编辑(基于 cmets)

    如果你想找出差异,使用TIMEDIFF函数:

    UPDATE `FlightSchedule` 
        SET delay = TIMEDIFF(ETA - STA)
        WHERE `flightNum_arr`='3517';
    

    【讨论】:

    • +1 以获得如此好的解释,哈哈 :)
    • @ØHankyPankyØ - 我认为如果人们不只是注意到错误消息,而是真正阅读它们并理解,很多问题都会得到解决: p
    • 其实答案在语法上是错误的,因为第二个别名不需要也不合适。
    • @GordonLinoff - 是的,谢谢(括号放错了)
    • 现在显示截断不正确的时间值:'6100.000000'
    【解决方案2】:

    问题出在嵌套子查询中。但你甚至不需要它。编写此查询的正确方法是:

    UPDATE `FlightSchedule` 
        SET delay = MINUTE(ETA - STA)
        WHERE `flightNum_arr`='3517';
    

    【讨论】:

    • 您不能在 FROM 子句中指定目标表 'FlightSchedule' 进行更新
    • @KlausosKlausos 。 . .抱歉,这是我推理的一步。
    • 我需要使用 MINUTE (ETA - STA)。您能告诉我如何在您的解决方案中使用它吗?
    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2016-11-29
    相关资源
    最近更新 更多