【问题标题】:MySQL Error #1064 - SQL Syntax ErrorMySQL 错误 #1064 - SQL 语法错误
【发布时间】:2014-08-26 19:27:52
【问题描述】:

我在 Maria Db 上为 MySQL 5.5.37 版本构建了以下查询

SELECT (
   Coalesce(`w`.`ID`, "") AS `w_ID`,
   Coalesce(`w`.`reportID`, "") AS `w_reportID`,
   Coalesce(`w`.`date`, "") AS `w_date`,
   Coalesce(`w`.`amount`, "") AS `w_amount`,
   Coalesce(`w`.`add25`, "") AS `w_add25`,
   Coalesce(`w`.add50, "") AS `w_add50`,
   Coalesce(`w.deplacement`, "") AS `w_deplacement`,
   Coalesce(`t.ID`, "") AS `t_id`,
   Coalesce(`t.reportID`, "") AS `t_reportID`,
   Coalesce(`t.date`, "") AS `t_date`,
   Coalesce(`t.time`, "") AS `t_time`,
   Coalesce(`t.amount`, "") AS `t_amount`,
   Coalesce(`t.unit`, "") AS `t_unit`,
   Coalesce(`t.price`, "") AS `t_price`;
FROM workhours w
LEFT JOIN trip t on w.reportID = t.reportID 
WHERE t.reportID = 13)
UNION
SELECT (
   Coalesce(`w1`.`ID`, "") AS `w_ID`,
   Coalesce(`w1`.`reportID`, "") AS `w_reportID`, 
   Coalesce(`w1`.`date`, "") AS `w_date`,
   Coalesce(`w1`.`amount`, "") AS `w_amount`,
   Coalesce(`w1`.`add25`, "") AS `w_add25`,
   Coalesce(`w1`.add50, "") AS `w_add50`,
   Coalesce(`w1.deplacement`, "") AS `w_deplacement`,
   Coalesce(`t1.ID`, "") AS `t_id`,
   Coalesce(`t1.reportID`, "") AS `t_reportID`,
   Coalesce(`t1.date`, "") AS `t_date`,
   Coalesce(`t1.time`, "") AS `t_time`,
   Coalesce(`t1.amount`, "") AS `t_amount`,
   Coalesce(`t1.unit`, "") AS `t_unit`,
   Coalesce(`t1.price`, "") AS `t_price`
FROM `workhours` w1
RIGHT JOIN `trip` t1 on `w1`.`reportID` = `t1`.`reportID` 
WHERE `t1`.`reportID` = 13)

当我运行它时,我得到以下错误代码:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AS `w_ID`, Coalesce(`w`.`reportID`, "") AS `w_reportID`, Coalesce(`w`.`da' at line 2 

我看不出这一行应该有什么问题? 有人有想法解决这个问题吗

我希望我提供了足够的信息。

【问题讨论】:

  • 除了两个答案:你还有一个;在第一个select语句的中间(就在第一个from之前)
  • where 子句将第一个子查询中的left join 转换为内连接。所以,我认为只有第二个子查询是必要的。
  • @GordonLinoff 请参阅此问题以获取与问题stackoverflow.com/a/25510443/2733506相关的更多数据
  • @hesamesa0r 。 . .我提供了一种在 MySQL 中获取full outer join 的不同方法。它可能会简化您尝试编写的查询。
  • 这个问题是由一个简单的印刷错误引起的。虽然类似的问题可能是这里的主题,但这个问题的解决方式不太可能帮助未来的读者。

标签: mysql sql mariadb


【解决方案1】:

select ( 的语法不正确,并且您在第一个查询中使用了 ;

SELECT
   Coalesce(`w`.`ID`, "") AS `w_ID`,
   Coalesce(`w`.`reportID`, "") AS `w_reportID`,
   Coalesce(`w`.`date`, "") AS `w_date`,
   Coalesce(`w`.`amount`, "") AS `w_amount`,
   Coalesce(`w`.`add25`, "") AS `w_add25`,
   Coalesce(`w`.add50, "") AS `w_add50`,
   Coalesce(`w.deplacement`, "") AS `w_deplacement`,
   Coalesce(`t.ID`, "") AS `t_id`,
   Coalesce(`t.reportID`, "") AS `t_reportID`,
   Coalesce(`t.date`, "") AS `t_date`,
   Coalesce(`t.time`, "") AS `t_time`,
   Coalesce(`t.amount`, "") AS `t_amount`,
   Coalesce(`t.unit`, "") AS `t_unit`,
   Coalesce(`t.price`, "") AS `t_price`
FROM workhours w
LEFT JOIN trip t on w.reportID = t.reportID AND w.date = t.date
WHERE t.reportID = 13
UNION
SELECT
   Coalesce(`w1`.`ID`, "") AS `w_ID`,
   Coalesce(`w1`.`reportID`, "") AS `w_reportID`, 
   Coalesce(`w1`.`date`, "") AS `w_date`,
   Coalesce(`w1`.`amount`, "") AS `w_amount`,
   Coalesce(`w1`.`add25`, "") AS `w_add25`,
   Coalesce(`w1`.add50, "") AS `w_add50`,
   Coalesce(`w1.deplacement`, "") AS `w_deplacement`,
   Coalesce(`t1.ID`, "") AS `t_id`,
   Coalesce(`t1.reportID`, "") AS `t_reportID`,
   Coalesce(`t1.date`, "") AS `t_date`,
   Coalesce(`t1.time`, "") AS `t_time`,
   Coalesce(`t1.amount`, "") AS `t_amount`,
   Coalesce(`t1.unit`, "") AS `t_unit`,
   Coalesce(`t1.price`, "") AS `t_price`
FROM `workhours` w1
RIGHT JOIN `trip` t1 on `w1`.`reportID` = `t1`.`reportID` AND w1.date = t1.date
WHERE `t1`.`reportID` = 13

这样你就可以在括号后面给整个结果集添加一个顺序

【讨论】:

  • select 包裹在(..) 中是完全没用的。另外,在第一个 from 之前还有一个 ;
  • @a_horse_with_no_name 我已经回答了同一用户的问题.. 给出了这个完整的外部选择.. OP 希望按日期订购数据.. 所以需要 () 以便您可以订购整个结果集
  • union 中的 order by 总是对 整个 联合进行排序,并且只允许在最后一个 select 部分之后。不需要将联合部分放在括号中:sqlfiddle.com/#!2/ac273/1
  • @a_horse_with_no_name 非常酷。我刚刚学到了一个新东西:) thnx 我将从答案中删除
  • @a_horse_with_no_name 所以我想你想要使用该语法的唯一原因是如果你试图按照联合查询对其进行排序,然后再次对其进行排序.. 有趣
【解决方案2】:

不要像你有的那样把 () 放在 select 里面。在 where 子句之后不需要 ( 在 select 或 ) 之后。将它们都删除。如果您出于某种原因在逻辑上需要它们,则 ( 在 select 关键字之前。

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多