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

MySql(Mariadb)“选择不存在”在sql文件中不起作用,mysql,sql,mariadb,mysql-error-1064,Mysql,Sql,Mariadb,Mysql Error 1064,我在mariadb终端中运行以下代码,它运行良好。一旦我把它放入一个.sql文件并运行它,我就会得到如下所示的错误。数据库设置正确,模式工作正常。我试图得到这样的输出: +----------+ | ALCOHOL_FREE_COMPLIANT | +----------+ | 0 | +----------+ SELECT NOT EXISTS ( select market_postcode, truck_id, alcohol from (

我在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服务器版本对应的手册,以了解在“选择不存在”附近使用的正确语法 从中选择市场邮政编码、卡车id、酒精 “在第20行

…要在“选择”附近使用的正确语法不存在

语法错误报告错误后的文本。在本例中,SQL解析器希望看到的不是SELECT

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

SELECT blah blah FROM MyTable ORDER BY date

SELECT NOT EXISTS( ...
看到按日期排序后没有分号了吗?因此,第二个SELECT仍在被解析,就好像它是第一个查询的一部分一样。当然,你不能在一个完整的查询之后再进行一次选择

这就是解释如何读取语法错误的全部内容,因为您将来还会遇到这个问题。我们都有

这与使用“不存在”无关。@trincot的评论不正确。您已经编写了一个有效的SQL表达式。NOT EXISTS只是一个布尔表达式,您可以在选择后的选择列表中使用它。不过,这不是一种常见的模式

如何更好地解决此查询?我是这样写的:

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和beverage之间的连接条件,否则将生成一个连接条件


据我所知,没有必要加入ChippOrder。但是您没有显示足够的信息让我们知道哪个列属于哪个表。

这确实是无效的SQL。select后面应该是表达式列表,而不是not exists,它属于where子句。where not exists可能更好。看这里:正确的方法是什么?非常感谢!现在有道理了