我在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行
答案 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。但是您没有向我们展示足够的信息来了解哪个列属于哪个表。