SQL语法错误修正

📑 目录
  1. 原语句实际执行逻辑
  2. 为什么您觉得 report_date 没起作用?
  3. 修正方法:使用括号强制改变优先级
  4. 补充建议
  5. 1. 使用 LEFT JOIN(保留所有符合条件的 es_10ltgd 记录,若没有匹配的 rise 则为 NULL)
  6. 2. 使用 INNER JOIN(只返回能在 njjrisewatching_history 中匹配到 rise 的记录)
  7. 说明

date: 2026-05-06 updated: 2026-05-06 conversation_id: 750e1ab2-b888-406f-b956-874c36dd4342 title: "SQL语法错误修正" tags: [deepseek, conversation] ---

SQL语法错误修正

创建时间: 2026-05-06 08:53

👤 用户:

select * from es10ltgd where holdername like "%UBS%" AND holdertype = "新进" reportdate = "2026-03-31 00:00:00"

1064 - 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 'report_date = "2026-03-31 00:00:00"' at line 1

时间: 0.006s


💭 思考过程

我们注意到用户的SQL语句有语法错误。用户提供的SQL是:

select * from es10ltgd where holdername like "%UBS%" AND holdertype = "新进" reportdate = "2026-03-31 00:00:00"

问题在于条件之间缺少AND关键字。应该是:... holdertype = "新进" AND reportdate = "2026-03-31 00:00:00"

另外,日期字符串可能推荐使用单引号,但双引号在MySQL中也是允许的(如果sqlmode不是ANSIQUOTES)。主要错误是缺少AND。

因此,正确SQL应为: select * from es10ltgd where holdername like "%UBS%" AND holdertype = "新进" AND reportdate = "2026-03-31 00:00:00"

此外,建议考虑使用单引号,以及确保日期格式正确。

回答需要解释错误并提供修正。

你的SQL语句中,report_date = "2026-03-31 00:00:00" 前面缺少了 AND 关键字,导致语法错误。

错误位置:

... holder_type = "新进" report_date = "2026-03-31 00:00:00"

修正后的SQL:

SELECT * FROM es_10ltgd 
WHERE holder_name LIKE '%UBS%' 
  AND holder_type = '新进' 
  AND report_date = '2026-03-31 00:00:00';

注意事项:

  • 在MySQL中,建议使用单引号 ' 包裹字符串和日期常量(双引号在非严格模式下也可用,但可能引起混淆)。
  • 日期时间值格式 '2026-03-31 00:00:00' 可以简写为 '2026-03-31'(如果列类型为 DATETIME 会自动补充时间为 00:00:00)。

执行修正后的语句即可正常查询。

👤 用户:

select code,holdername,holdnumchange,reportdate from es10ltgd where holdername like "%UBS%" OR holdername like "%高盛%" AND holdnumchange = "新进" and reportdate = "2026-03-31 00:00:00"

以上查询中,为什么report_date不起作用呢


💭 思考过程

我们分析这个SQL语句,用户问为什么report_date不起作用。语句:

select code,holdername,holdnumchange,reportdate from es10ltgd where holdername like "%UBS%" OR holdername like "%高盛%" AND holdnumchange = "新进" and reportdate = "2026-03-31 00:00:00"

问题:由于AND优先级高于OR,实际逻辑是: holdername like "%UBS%" OR ( holdername like "%高盛%" AND holdnumchange = "新进" and report_date = "2026-03-31 00:00:00" )

所以reportdate条件只作用于高盛那部分,而UBS部分不受reportdate限制,所以会返回所有UBS的记录(不论日期)。用户期望两个条件都受reportdate限制,但因为没有括号,导致reportdate没有应用到UBS上。

因此report_date“不起作用”是针对UBS的部分而言。用户可能看到UBS的旧日期记录也出来了。

解决方案:加括号将OR条件括起来,再与report_date AND。

需要解释清楚。

您的SQL语句中 reportdate 条件“看起来没起作用”,是因为 AND 的优先级高于 OR,导致条件被错误分组,使得 reportdate 只限制了“高盛”部分,而没有限制“UBS”部分。

原语句实际执行逻辑

WHERE 
    holder_name LIKE '%UBS%' 
    OR 
    (   holder_name LIKE '%高盛%' 
        AND hold_num_change = '新进' 
        AND report_date = '2026-03-31 00:00:00'
    )
  • 只要 holdername 包含 UBS,无论 reportdate 是多少、无论 holdnumchange 是什么,都会被选中。
  • 只有针对“高盛”的记录,才要求同时满足“新进”和指定日期。

为什么您觉得 report_date 没起作用?

因为查询结果中出现了 UBSreportdate 不是 2026-03-31 的记录,这符合上述逻辑。您原本的意图应该是:UBS 或 高盛,都必须同时满足 holdnumchange='新进'reportdate='2026-03-31'

修正方法:使用括号强制改变优先级

SELECT code, holder_name, hold_num_change, report_date 
FROM es_10ltgd 
WHERE 
    ( holder_name LIKE '%UBS%' OR holder_name LIKE '%高盛%' )
    AND hold_num_change = '新进' 
    AND report_date = '2026-03-31 00:00:00';

这样 report_date 条件就会同时作用于 UBS 和高盛两部分的记录。

补充建议

  • 字符串和日期常量建议使用单引号 ',避免与标识符双引号混淆。
  • 如果 reportdate 字段类型是 DATEDATETIME,可以简写为 reportdate = '2026-03-31'

👤 用户:

在以上查询中,用code关联查询njjrisewatching_history中的rise


💭 思考过程

我们被要求:在以上查询中,用code关联查询njjrisewatching_history中的rise。

原查询: select code,holdername,holdnumchange,reportdate from es10ltgd where (holdername like "%UBS%" OR holdername like "%高盛%") AND holdnumchange = "新进" and reportdate = "2026-03-31 00:00:00"

现在需要关联表 njjrisewatching_history,获取其中的 rise 字段。需要指定如何关联?通常是通过 code 关联。所以应该是一个 JOIN 操作。

用户没有给出 njjrisewatchinghistory 的具体列,但肯定有 code 和 rise。我们需要写出一个 SELECT 语句,从 es10ltgd 中选字段,并关联 njjrisewatching_history 获取 rise。

注意:原查询中有 holdername 条件、holdnumchange 条件、reportdate 条件。保持这些条件。

假设 njjrisewatching_history 表中有 code 列和 rise 列。可能需要考虑 LEFT JOIN 还是 INNER JOIN?如果需要确保有 rise 记录才返回,用 INNER JOIN;否则保留原记录用 LEFT JOIN。用户没有明确,但通常要取出 rise,可能用 LEFT JOIN 避免丢失数据。但可以默认 INNER JOIN 要求匹配。

我给出两种可能,但先给出一种典型的:使用 LEFT JOIN 并显示 rise,如果没有匹配则为 NULL。

写 SQL: SELECT e.code, e.holdername, e.holdnumchange, e.reportdate, w.rise FROM es10ltgd e LEFT JOIN njjrisewatchinghistory w ON e.code = w.code WHERE (e.holdername LIKE '%UBS%' OR e.holdername LIKE '%高盛%') AND e.holdnumchange = '新进' AND e.report_date = '2026-03-31 00:00:00';

如果只需有 rise 的记录,将 LEFT JOIN 改为 JOIN。

注意原查询中日期字符串使用了双引号,可以保持或改为单引号。

需要解释一下。

要在原有查询基础上,通过 code 字段关联 njjrisewatching_history 表并获取其中的 rise 字段,可以使用 JOINLEFT JOIN。下面提供两种写法:

1. 使用 LEFT JOIN(保留所有符合条件的 es_10ltgd 记录,若没有匹配的 rise 则为 NULL)

SELECT 
    e.code,
    e.holder_name,
    e.hold_num_change,
    e.report_date,
    w.rise
FROM es_10ltgd e
LEFT JOIN njj_rise_watching_history w ON e.code = w.code
WHERE 
    (e.holder_name LIKE '%UBS%' OR e.holder_name LIKE '%高盛%')
    AND e.hold_num_change = '新进'
    AND e.report_date = '2026-03-31 00:00:00';

2. 使用 INNER JOIN(只返回能在 njjrisewatching_history 中匹配到 rise 的记录)

SELECT 
    e.code,
    e.holder_name,
    e.hold_num_change,
    e.report_date,
    w.rise
FROM es_10ltgd e
INNER JOIN njj_rise_watching_history w ON e.code = w.code
WHERE 
    (e.holder_name LIKE '%UBS%' OR e.holder_name LIKE '%高盛%')
    AND e.hold_num_change = '新进'
    AND e.report_date = '2026-03-31 00:00:00';

说明

  • 假设 njjrisewatching_history 表中包含字段 coderise
  • 如果 rise 需要其他过滤条件(如只取最新记录),可能需要进一步使用子查询或 ORDER BY + LIMIT,但当前需求未提及,暂按直接关联处理。
  • 日期条件中的双引号可以改为单引号,避免歧义。

请根据实际业务需求选择 LEFT JOININNER JOIN