小工具 · 规范库 · 测试规范(测试计划 / 用例 / SQL 验证)
SQL 查询生成器
rules/30-testing/sql-query.md
SQL 查询生成器
根据用户需求,生成符合 HIS 数据库规范的 SQL 查询语句。
核心规则:表别名命名规范
规则:表别名 = 表名中各下划线分隔段的首字母,小写拼接。
| 表名 | 拆分 | 别名 |
|---|---|---|
| SC_CLASS | S + C | sc |
| SC_APPOINT | S + A | sa |
| SC_SCHEDULE | S + S | ss |
| SC_SCHEDULE_CHANNEL | S + S + C | ssc |
| SC_SCHEDULE_TICKETS | S + S + T | sst |
| SC_SERVE | S + SE | sse |
| SC_SERVE_CHANNEL | S + S + C → 冲突 → S + SE + C | ssec |
| SC_CHANNEL | S + CH | sch |
| SC_DAYSLOT | S + D | sd |
| SC_PLAN | S + P | sp |
| SC_PLAN_CHANNEL | S + P + C | spc |
| SC_PLAN_TICKET | S + P + T | spt |
| SC_PLAN_TICKETS | S + P + T + S | spts |
| SC_TICKET | S + T | st |
| SC_CLASS_PRICE | S + C + P | scp |
| PI_PAT | P + P | pp |
| PI_PAT_CLASS | P + P + C | ppc |
| PI_CHARGE_TYPE | P + C + T | pct |
| RE_DEPT | R + D | rd |
| RE_EMP | R + E | re |
| PR_PRICE_ITEM | P + P + I | ppi |
| PR_MULTI_PRICE | P + M + P | pmp |
| VI_VISIT | V + V | vv |
| VI_VISIT_OP | V + V + O | vvo |
| SD_DATA | S + D | sdd |
冲突解决策略
当多张表生成相同别名时,按以下优先级解决:
- 扩展第二段字母:从第二段取更多字母直到唯一(如
SC_SERVE→ 取SE→sse,避免与SC_SCHEDULE→ss冲突) - 扩展第三段字母:三段表名冲突时扩展第三段(如
SC_SERVE_CHANNEL→ssec,避免与SC_SCHEDULE_CHANNEL→ssc冲突) - 极端冲突:加数字后缀(极少出现)
冲突处理示例
| 别名冲突 | 解决方案 |
|---|---|
SC_SCHEDULE (ss) vs SC_SERVE (ss) | SC_SCHEDULE 保留 ss,SC_SERVE 扩展为 sse |
SC_CLASS (sc) vs SC_CHANNEL (sc) | SC_CLASS 保留 sc,SC_CHANNEL 扩展为 sch |
SC_SCHEDULE_CHANNEL (ssc) vs SC_SERVE_CHANNEL (ssc) | SC_SCHEDULE_CHANNEL 保留 ssc,SC_SERVE_CHANNEL 扩展为 ssec |
SC_DAYSLOT (sd) vs SD_DATA (sd) | SC_DAYSLOT 保留 sd,SD_DATA 扩展为 sdd |
核心规则:字段别名命名规范
规则:字段别名 = 字段名_中文说明,格式为 别名.字段名 AS 字段名_中文说明
这样查询结果中每一列都同时显示字段名和中文含义,便于阅读和理解。
示例
-- 正确写法
pp.PAT_CODE AS PAT_CODE_患者编码,
pp.PAT_NAME AS PAT_NAME_患者姓名,
ss.AMOUNT_TOTAL AS AMOUNT_TOTAL_总号源数
-- 错误写法(不要只用纯中文)
pp.PAT_CODE AS 患者编码
SQL 生成模板
标准格式
-- 查询目的简述
SELECT
-- 格式:别名.字段名 AS 字段名_中文说明
pp.PAT_NAME AS PAT_NAME_患者姓名,
pp.PAT_CODE AS PAT_CODE_患者编码
FROM SC_APPOINT sa
INNER JOIN SC_CLASS sc
ON sa.ID_CLASS = sc.ID_CLASS
INNER JOIN SC_SCHEDULE ss
ON sa.ID_SCHEDULE = ss.ID_SCHEDULE
LEFT JOIN SC_SERVE sse
ON ss.ID_SERVE = sse.ID_SERVE
LEFT JOIN PI_PAT pp
ON sa.ID_PAT = pp.ID_PAT
WHERE sc.CLASS_CODE = '0603'
AND sa.CANCEL_INDICATOR = 0
ORDER BY ss.DAY_SCHEDULE DESC;
格式要求
- SELECT 子句:每行一个字段,格式为
别名.字段名 AS 字段名_中文说明,对齐列 - 分组注释:每组字段前用
-- 中文说明 表名(中文表名)标注来源表 - FROM / JOIN:明确标注 JOIN 类型(INNER / LEFT),每个 JOIN 独占一行并缩进4空格
- ON 条件:与 JOIN 同行,格式为
别名.字段 = 别名.字段 - WHERE 条件:每个条件独占一行,用
AND/OR连接并缩进对齐 - ORDER BY:放在最后,标明排序方向(ASC / DESC)
- 注释:SQL 顶部用
--注释说明查询目的
标准格式(含分组注释)
-- 查询目的简述
SELECT
-- 患者信息 PI_PAT(患者基本信息)
pp.PAT_CODE AS PAT_CODE_患者编码,
pp.PAT_NAME AS PAT_NAME_患者姓名,
-- 挂号信息 VI_VISIT(患者就诊表)
vv.VISIT_CODE AS VISIT_CODE_就诊编码,
vv.DT_ENTRY AS DT_ENTRY_挂号时间,
-- 排班号源 SC_SCHEDULE(计划排班_排班)
ss.AMOUNT_TOTAL AS AMOUNT_TOTAL_总号源数,
ss.AMOUNT_CHKIN_USED AS AMOUNT_CHKIN_USED_已挂号数,
-- 号别信息 SC_SERVE(计划排班_号别)
sse.SERVE_NAME AS SERVE_NAME_号别名称,
sse.DEPT_NAME AS DEPT_NAME_科室名称
FROM VI_VISIT vv
...
HIS 常用表关联关系
SC_CLASS (号类) ──ID_CLASS──→ SC_SERVE (号别) ──ID_SERVE──→ SC_SCHEDULE (排班)
│ │ │
└──────ID_CLASS──→ SC_APPOINT ←──────ID_SCHEDULE──────────┘
│
ID_PAT → PI_PAT (患者)
SC_SCHEDULE ──ID_SCHEDULE──→ SC_SCHEDULE_CHANNEL (排班渠道) ──ID_CHANNEL──→ SC_CHANNEL (渠道)
SC_SCHEDULE ──ID_SCHEDULE──→ SC_SCHEDULE_TICKETS (排班号段)
SC_SERVE ──ID_SERVE──→ SC_SERVE_CHANNEL (号别渠道) ──ID_CHANNEL──→ SC_CHANNEL (渠道)
SC_PLAN (出诊计划) ──ID_PLAN──→ SC_SCHEDULE
执行步骤
当用户提出 SQL 查询需求时,按以下步骤执行:
- 识别涉及的表:根据用户需求确定需要查询哪些表
- 生成别名:按照别名命名规则为每张表分配别名
- 确定关联关系:根据 HIS 表关联关系图确定 JOIN 条件
- 编写 SQL:按照标准格式生成 SQL 语句
- 添加注释:在关键字段旁添加中文注释说明
- 输出结果:将完整的 SQL 语句输出给用户