我有以下mysql代码,我在shell脚本中运行:
mysql -u "$DB_USER" -p"$DB_PASSWD" "$DB_SOURCE" << MYSQLEOF
DELETE FROM list_subscriber_events WHERE subscriberid IN
(SELECT subscriberid FROM
(SELECT subscriberid FROM `list_subscriber_events` WHERE subscriberid NOT IN
(SELECT subscriberid FROM list_subscribers)) AS c);
MYSQLEOF
当在mysql中从命令行运行删除查询时我没有问题 - 它运行正常。
但是,当在bash脚本中运行它时,我收到以下错误:
ERROR 1064 (42000) at line 4: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE subscriberid NOT IN
(SELECT subscriberid FROM list_subscribers)) AS c)' at line 3
ssh exited with exit code 1
我花了好几个小时尝试各种各样的变化 - 我似乎无法解决它。任何帮助将不胜感激 - 我可能错过了一些明显的东西。
答案 0 :(得分:0)
尝试删除反引号字符
FROM `list_subscriber_events` WHERE
^ ^
在shell命令行的上下文中,那些反引号表示需要运行的东西,并且从中返回它。
我怀疑shell正在解释这些反引号,并尝试执行list_subscriber_events
,这可能会返回错误。结果是它被一个空字符串替换...结果语句是
... FROM WHERE ...
如果你必须包含反引号,可能在反斜杠前面加一个反斜杠字符就会逃脱它。
<强>后续强>
完全不同的是,您似乎有更多内联视图是必要的。并且有潜力&#34;陷阱&#34;如果子查询返回NULL值,则使用NOT IN
。 (也许您可以保证subscriberid
中list_subscribers
不为NULL。或者,您可能希望在子查询返回NULL值时获得行为。)
看起来像一个更简单的查询,使用反连接模式将完成您似乎在...之后的结果...从list_subscriber_events
中删除subscriberid
值未出现的行list_subscribers
DELETE e.*
FROM list_subscriber_events e
LEFT
JOIN list_subscribers l
ON l.subscriberid = d.subscriberid
WHERE l.subscriberid IS NULL