MySql(Mariadb)'选择不存在'在sql文件中不起作用

时间:2017-03-19 21:14:43

标签: mysql sql mariadb mysql-error-1064

我在mariadb终端中运行以下代码,它运行正常。一旦我把它放入.sql文件并运行它,我得到如下所示的错误。数据库设置正确,架构运行正常。我试图得到这样的输出:

 +----------+
 | ALCOHOL_FREE_COMPLIANT |
 +----------+
 |        0 |
 +----------+


SELECT NOT EXISTS (
    select market_postcode, truck_id, alcohol from (
          SELECT * FROM buybeverage JOIN beverage
    )AS beverageOrders
LEFT JOIN ChippOrder ON (chipporder.order_id = beverageOrders.order_id)

WHERE alcohol = 1 AND market_postcode = "E16AA"

) AS ALCOHOL_FREE_COMPLIANT;
  

第43行的错误1064(42000):您的SQL语法出错;检查与您的MariaDB服务器版本对应的手册,以便在'SELECT NOT EXISTS附近使用正确的语法(       选择market_postcode,truck_id,酒精饮料(          '在第20行

1 个答案:

答案 0 :(得分:2)

  

...在'SELECT NOT EXISTS ...

附近使用正确的语法

语法错误报告跟随错误。在这种情况下,SQL解析器期望看到除SELECT之外的其他内容。

我怀疑你没有用分号(;)来终止SQL查询之前你在上面的问题中显示的那个。例如:

SELECT blah blah FROM MyTable ORDER BY date

SELECT NOT EXISTS( ...

看看ORDER BY date之后没有分号?所以第二个SELECT仍然被解析,好像它是第一个查询的一部分。当然,您不能在完整查询后再添加SELECT

这就是解释如何阅读语法错误的全部内容,因为将来会再次遇到此问题。我们都这样做。

这与使用NOT EXISTS无关。来自@trincot的评论不正确。您已编写了有效的SQL表达式。 NOT EXISTS ()只是一个布尔表达式,可以SELECT之后的选择列表中使用它。但这并不是一种常见的模式。

如何更好地解决此问题?这是我写的方式:

SELECT COUNT(*) = 0 AS ALCOHOL_FREE_COMPLIANT 
FROM buybeverage JOIN beverage 
  ON (...join condition, which you are missing...)
WHERE alcohol = 1 AND market_postcode = 'E16AA'

不需要子查询。

无需选择任何列,因为您只想知道是否有零个或多个零匹配条件。

您需要在buybeverage和饮料之间加入条件,否则您将生成Cartesian product

据我所知,无需加入ChippOrder。但是您没有向我们展示足够的信息来了解哪个列属于哪个表。