【问题标题】:Every derived table must have its own alias error每个派生表都必须有自己的别名错误
【发布时间】:2010-08-08 20:50:31
【问题描述】:

运行以下查询时出现该错误:

SELECT MAX( DateTime )
FROM (
(
    SELECT DateTime
    FROM Class_Searches
)
UNION ALL (
    SELECT DateTime
    FROM Book_Searches
)
)
WHERE User_Email = 'bla@blah.com'
AND DateTime > NOW( ) - INTERVAL 30 DAY 

我知道我需要添加别名,但我不确定在哪里

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    您需要子查询的别名,并且您需要将条件应用于您联合的两个查询:

    SELECT MAX(DateTime)
    FROM (
    
      SELECT DateTime
      FROM Class_Searches
      WHERE User_Email = 'bla@blah.com'
      AND DateTime > NOW( ) - INTERVAL 30 DAY
    
      UNION ALL
    
      SELECT DateTime
      FROM Book_Searches
      WHERE User_Email = 'bla@blah.com'
      AND DateTime > NOW( ) - INTERVAL 30 DAY
    
    ) AS x
    

    或返回数据,以便您可以在外部查询中应用条件:

    SELECT MAX(DateTime)
    FROM (
    
      SELECT DateTime, User_Email
      FROM Class_Searches
    
      UNION ALL
    
      SELECT DateTime, User_Email
      FROM Book_Searches
    
    ) AS x
    WHERE User_Email = 'bla@blah.com'
    AND DateTime > NOW( ) - INTERVAL 30 DAY
    

    【讨论】:

      【解决方案2】:

      别名是当您重命名某些东西时,例如SELECT t.time from table tt 是该表的别名。在这种情况下,您需要为子查询生成的表指定别名:

      SELECT MAX( ut.DateTime )
      FROM (
      (
          SELECT DateTime
          FROM Class_Searches
      ) cs
      UNION ALL (
          SELECT DateTime
          FROM Book_Searches
      ) bs
      ) ut
      WHERE User_Email = 'bla@blah.com'
      AND ut.DateTime > NOW( ) - INTERVAL 30 DAY 
      

      但这仍然行不通,因为您没有从 UNION 返回的 User_Email 列。因此,尝试:

      SELECT MAX( ut.DateTime )
      FROM (
      (
          SELECT DateTime, User_Email
          FROM Class_Searches
      ) cs
      UNION ALL (
          SELECT DateTime, User_Email
          FROM Book_Searches
      ) bs
      ) ut
      WHERE ut.User_Email = 'bla@blah.com'
      AND ut.DateTime > NOW( ) - INTERVAL 30 DAY
      

      由于 UNION 语法,这可能仍然无法正常工作,但至少它更接近。

      【讨论】:

      • 第二个查询出现此错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'bs) ut WHERE ut.User_Email = 'bla@blah.com' AND ut.DateTime > NOW( ) - INTER' 附近使用正确的语法,第 10 行
      猜你喜欢
      • 2017-09-02
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2012-05-16
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多