宇我的小宇宙
小工具 · 规范库 · 测试规范(测试计划 / 用例 / SQL 验证)

SQL 查询生成器

← 返回上一页
rules/30-testing/sql-query.md

SQL 查询生成器

根据用户需求,生成符合 HIS 数据库规范的 SQL 查询语句。

核心规则:表别名命名规范

规则:表别名 = 表名中各下划线分隔段的首字母,小写拼接。

表名拆分别名
SC_CLASSS + Csc
SC_APPOINTS + Asa
SC_SCHEDULES + Sss
SC_SCHEDULE_CHANNELS + S + Cssc
SC_SCHEDULE_TICKETSS + S + Tsst
SC_SERVES + SEsse
SC_SERVE_CHANNELS + S + C → 冲突 → S + SE + Cssec
SC_CHANNELS + CHsch
SC_DAYSLOTS + Dsd
SC_PLANS + Psp
SC_PLAN_CHANNELS + P + Cspc
SC_PLAN_TICKETS + P + Tspt
SC_PLAN_TICKETSS + P + T + Sspts
SC_TICKETS + Tst
SC_CLASS_PRICES + C + Pscp
PI_PATP + Ppp
PI_PAT_CLASSP + P + Cppc
PI_CHARGE_TYPEP + C + Tpct
RE_DEPTR + Drd
RE_EMPR + Ere
PR_PRICE_ITEMP + P + Ippi
PR_MULTI_PRICEP + M + Ppmp
VI_VISITV + Vvv
VI_VISIT_OPV + V + Ovvo
SD_DATAS + Dsdd

冲突解决策略

当多张表生成相同别名时,按以下优先级解决:

  1. 扩展第二段字母:从第二段取更多字母直到唯一(如 SC_SERVE → 取 SE → sse,避免与 SC_SCHEDULE → ss 冲突)
  2. 扩展第三段字母:三段表名冲突时扩展第三段(如 SC_SERVE_CHANNEL → ssec,避免与 SC_SCHEDULE_CHANNEL → ssc 冲突)
  3. 极端冲突:加数字后缀(极少出现)

冲突处理示例

别名冲突解决方案
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;

格式要求

  1. SELECT 子句:每行一个字段,格式为 别名.字段名 AS 字段名_中文说明,对齐列
  2. 分组注释:每组字段前用 -- 中文说明 表名(中文表名) 标注来源表
  3. FROM / JOIN:明确标注 JOIN 类型(INNER / LEFT),每个 JOIN 独占一行并缩进4空格
  4. ON 条件:与 JOIN 同行,格式为 别名.字段 = 别名.字段
  5. WHERE 条件:每个条件独占一行,用 AND / OR 连接并缩进对齐
  6. ORDER BY:放在最后,标明排序方向(ASC / DESC)
  7. 注释: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 查询需求时,按以下步骤执行:

  1. 识别涉及的表:根据用户需求确定需要查询哪些表
  2. 生成别名:按照别名命名规则为每张表分配别名
  3. 确定关联关系:根据 HIS 表关联关系图确定 JOIN 条件
  4. 编写 SQL:按照标准格式生成 SQL 语句
  5. 添加注释:在关键字段旁添加中文注释说明
  6. 输出结果:将完整的 SQL 语句输出给用户