MySql (Mariadb) 'Select not exists' 在 sql 文件中不起作用

MySql (Mariadb) 'Select not exists' doesn't work in sql file

我在 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;

ERROR 1064 (42000) at line 43: 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 'SELECT NOT EXISTS ( select market_postcode, truck_id, alcohol from ( ' at line 20

...right syntax to use near '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 列表中使用它。不过,这不是常见的模式。

如何更好地解决这个问题?我是这样写的:

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'

不需要子查询。

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

buybeverage 和 beverage 之间需要一个连接条件,否则会生成 Cartesian product

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