【问题标题】:You have an issue in your SQL syntax but don't know the cause您的 SQL 语法有问题但不知道原因
【发布时间】:2019-01-22 10:48:02
【问题描述】:
INSERT INTO tkblue_tklabel_dev_archdata.EmailContent2016
(
    SELECT tkblue_tklabel_dev_data.EmailContent.*
    FROM tkblue_tklabel_dev_data.EmailContent
    LEFT JOIN tkblue_tklabel_dev_archdata.EmailTracking ON tkblue_tklabel_dev_archdata.EmailTracking.id = tkblue_tklabel_dev_data.EmailContent.idEmailParam
    WHERE (tkblue_tklabel_dev_archdata.EmailTracking.EmailDate <= "2016-12-31 23:59:59" and tkblue_tklabel_dev_archdata.EmailTracking.EmailDate >= "2016-01-01 00:00:00"); 
);

您的 SQL 语法有错误;检查手册 对应于您的 MariaDB 服务器版本,以便使用正确的语法 在第 6 行的 '' 附近

我没有成功找到这个错误的原因。

【问题讨论】:

  • 需要去掉where行末尾的分号>= "2016-01-01 00:00:00");
  • @nacho 我认为这可能是一个答案

标签: mysql sql


【解决方案1】:

INSERT 中,括号应该用于列出列,而不是用于生成数据的查询。

在这种情况下,您似乎知道数据具有相同的格式,因此不使用列列表是可以的——尽管create table as 会比insert 更好。

无论如何:

INSERT INTO tkblue_tklabel_dev_archdata.EmailContent2016
    SELECT ec.*
    FROM tkblue_tklabel_dev_data.EmailContent ec JOIN
         tkblue_tklabel_dev_archdata.EmailTracking et
         ON et.id = ec.idEmailParam
    WHERE et.EmailDate < '2017-01-01' AND
          et.EmailDate >= '2016-01-01';

我还介绍了表别名,它使查询更易于编写和阅读。这也简化了日期逻辑。

这也将JOIN 更改为内部连接——WHERE 子句无论如何都会这样做。

为了防止由JOIN 引起的重复,我会改用EXISTS

INSERT INTO tkblue_tklabel_dev_archdata.EmailContent2016
    SELECT ec.*
    FROM tkblue_tklabel_dev_data.EmailContent ec
    WHERE EXISTS (SELECT 1           
                  FROM tkblue_tklabel_dev_archdata.EmailTracking et
                  WHERE et.id = ec.idEmailParam AND
                        et.EmailDate < '2017-01-01' AND
                        et.EmailDate >= '2016-01-01'
                 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 2020-12-28
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多