MySQL执行CREATE VIEW报ER_PARSE_ERROR语法错误排查
你的SQL语句存在的问题
- 标识符语法错误:方括号
[]是SQL Server的标识符包裹语法,MySQL不支持。带空格的视图名需要用MySQL规定的反引号`包裹。 - 表名拼写错误:存储患者和病房关联关系的表名是
Contains,你写的Contain漏了末尾的s,会报表不存在的错误。 - 日期值语法错误:SQL中的日期字面量必须用单引号包裹,你写的
1952-05-31没有加引号,会被MySQL解析为算术运算表达式(计算1952减5减31的数值结果),无法和日期类型的DOB字段正确比较。 - 关联逻辑缺失:
- 没有写
Prescribed表和Patient表的关联条件,会产生笛卡尔积,出现大量重复错误数据 - 完全没有关联
Ward表和Drug表,无法获取要求覆盖的病房信息、药品信息维度 - 老式逗号隐式连接的写法容易漏写关联条件,建议改用显式JOIN写法
- 没有写
- 字段选择不符合需求:
- 没有选取病房名称、病房类型、药品名称、药品单位成本这些要求的字段
- 没有按照要求排除
wardNo、noOfBeds两个字段 - 硬编码日期阈值
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
相关产品推荐
相关产品推荐

