You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL执行CREATE VIEW报ER_PARSE_ERROR语法错误排查

你的SQL语句存在的问题
  • 标识符语法错误:方括号[]是SQL Server的标识符包裹语法,MySQL不支持。带空格的视图名需要用MySQL规定的反引号`包裹。
  • 表名拼写错误:存储患者和病房关联关系的表名是Contains,你写的Contain漏了末尾的s,会报表不存在的错误。
  • 日期值语法错误:SQL中的日期字面量必须用单引号包裹,你写的1952-05-31没有加引号,会被MySQL解析为算术运算表达式(计算1952减5减31的数值结果),无法和日期类型的DOB字段正确比较。
  • 关联逻辑缺失:
    1. 没有写Prescribed表和Patient表的关联条件,会产生笛卡尔积,出现大量重复错误数据
    2. 完全没有关联Ward表和Drug表,无法获取要求覆盖的病房信息、药品信息维度
    3. 老式逗号隐式连接的写法容易漏写关联条件,建议改用显式JOIN写法
  • 字段选择不符合需求:
    1. 没有选取病房名称、病房类型、药品名称、药品单位成本这些要求的字段
    2. 没有按照要求排除wardNo、noOfBeds两个字段
    3. 硬编码日期阈值1952-05-31的方式不灵活,年龄计算应该基于当前日期动态判断,不需要每年手动改阈值
修正后的SQL语句
CREATE VIEW `Patients Over Seventy` AS
SELECT 
  p.patientNo,
  p.patName,
  p.patAddr,
  p.DOB,
  c.admissionDate,
  w.wardName,
  w.wardType,
  d.drugNo,
  d.drugName,
  d.costPerUnit,
  r.unitsPerDay,
  r.startDate,
  r.finishDate
FROM Patient p
INNER JOIN Contains c
  ON p.patientNo = c.patientNo
INNER JOIN Ward w
  ON c.wardNo = w.wardNo
INNER JOIN Prescribed r
  ON p.patientNo = r.patientNo
INNER JOIN Drug d
  ON r.drugNo = d.drugNo
WHERE TIMESTAMPDIFF(YEAR, p.DOB, CURDATE()) >= 70;

说明:用TIMESTAMPDIFF(YEAR, p.DOB, CURDATE())计算患者实际年龄,可以准确判断是否满70周岁,不会出现周岁计算错误的问题;SELECT中明确列出所有需要的字段,没有查询要求排除的wardNo、noOfBeds;所有表通过显式INNER JOIN关联,不会漏关联条件。

内容的提问来源于stack exchange,提问作者Chelsea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:27:27