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