Skip to content

常见 SQL 查询

二次开发中常用的数据库查询语句汇总。

常用表说明

二次开发中常用以下几张表;字段及更多表结构说明,见产品手册《慧正表单引擎 V8-数据库设计报告》。

表单、视图定义

表名说明
TD_HORIZON_PAGE页面表
TD_HORIZON_PAGE_VERSION页面版本基本信息表
TD_HORIZON_FORM表单基本信息表
TD_HORIZON_FORM_FIELD表单字段基本信息表
TD_HORIZON_FIELD字段属性基本信息表
TD_HORIZON_VIEW视图基本信息表
TD_HORIZON_VIEW_FIELD视图字段基本信息表
TD_HORIZON_BUTTON按钮基本信息表
TDR_HORIZON_OBJECT_BUTTON按钮关联表
TD_HORIZON_TABLE库表基本信息表
TD_HORIZON_TABLE_FIELD库表字段基本信息表

业务数据表

表名说明
TDR_HORIZON_PAGE_DATA页面表单业务数据关联表
TF_HORIZON_OPINION个人意见存储表
TA_HORIZON_INFO附件基本信息存储表
TS_HORIZON_DICTIONARY字典表

本文 SQL 别名约定

别名
WLTW_HZ_WORKLIST(待办)
WDTW_HZ_WORKLIST_DONE(已办)
INSTW_HZ_INSTANCE(流程实例)
INRTWR_HZ_INSTANCE(实例与表单数据关联)
PDTDR_HORIZON_PAGE_DATA(页面表单业务数据关联)
TKTW_HZ_TRACK(活动路径)
BIZ业务表(示例为 A_BUSINESS_MAIN,请替换)
PVTD_HORIZON_PAGE_VERSION
FMTD_HORIZON_FORM

流程关联业务数据查询

以下示例演示如何关联业务表,查询「我的待办」「我的已办」(同一实例只取最新一条)、「我的申请」「结束流程」「流程状态」。

使用说明

请将示例中的业务表名、字段、FLOWIDuserid 替换为实际值。关联条件统一使用 INNER JOIN;可选关联(如待办身份)使用 LEFT JOIN

我的待办

sql
SELECT
    WL.WORKID,
    WL.TRACKID,
    CONCAT(WL.SUBJECTION_TYPE, '_', WL.SUBJECTION_ID) AS SUBJECTIONID,
    WL.SENDTIME,
    BIZ.*
FROM TW_HZ_WORKLIST WL
INNER JOIN TWR_HZ_INSTANCE INR ON WL.WORKID = INR.WORKID
INNER JOIN TDR_HORIZON_PAGE_DATA PD ON INR.DATAID = PD.DATA_ID
INNER JOIN A_BUSINESS_MAIN BIZ ON PD.FORM_DATA_ID = BIZ.ID -- 业务表
WHERE (WL.AUTH_ID = 'admin' OR WL.AGENT_ID = 'admin')
ORDER BY WL.SENDTIME DESC

我的已办

同一条实例只查询最新一条已办记录。

sql
SELECT
    WD.SENDTIME,
    WD.WORKID,
    BIZ.*
FROM (
    SELECT
        MAX(DOTIME) AS SENDTIME,
        WORKID,
        FLOWID
    FROM TW_HZ_WORKLIST_DONE
    WHERE (AUTH_ID = 'admin' OR AGENT_ID = 'admin')
      AND STATUS_NO > 200
      AND STATUS_NO < 300
    GROUP BY WORKID, FLOWID
) WD
INNER JOIN TWR_HZ_INSTANCE INR ON WD.WORKID = INR.WORKID
INNER JOIN TDR_HORIZON_PAGE_DATA PD ON INR.DATAID = PD.DATA_ID
INNER JOIN A_BUSINESS_MAIN BIZ ON PD.FORM_DATA_ID = BIZ.ID -- 业务表
ORDER BY WD.SENDTIME DESC

我的申请

sql
SELECT
    INS.ID AS WORKID,
    INS.CREATED,
    BIZ.*
FROM A_BUSINESS_MAIN BIZ -- 业务表
INNER JOIN TDR_HORIZON_PAGE_DATA PD ON PD.FORM_DATA_ID = BIZ.ID
INNER JOIN TWR_HZ_INSTANCE INR ON INR.DATAID = PD.DATA_ID
INNER JOIN TW_HZ_INSTANCE INS ON INS.ID = INR.WORKID
WHERE INS.CREATOR = 'admin'
ORDER BY INS.CREATED DESC

结束流程

FLOWSTATUS = '170' 表示流程已结束。用 EXISTS 判断结束状态,避免路径表一对多导致重复行。

sql
SELECT
    INS.ID AS WORKID,
    INS.FLOWID,
    INS.CREATED,
    INS.TITLE,
    BIZ.*
FROM TW_HZ_INSTANCE INS
INNER JOIN TWR_HZ_INSTANCE INR ON INS.ID = INR.WORKID
INNER JOIN TDR_HORIZON_PAGE_DATA PD ON INR.DATAID = PD.DATA_ID
INNER JOIN A_BUSINESS_MAIN BIZ ON BIZ.ID = PD.FORM_DATA_ID -- 业务表
WHERE EXISTS (
      SELECT 1
      FROM TW_HZ_TRACK TK
      WHERE TK.WORKID = INS.ID
        AND TK.FLOWSTATUS = '170'
  )
ORDER BY INS.CREATED DESC

若还要限定「当前用户参与过的流程」,可再增加:

sql
AND EXISTS (
    SELECT 1
    FROM TW_HZ_WORKLIST_DONE WD
    WHERE WD.WORKID = INS.ID
      AND (WD.AUTH_ID = 'admin' OR WD.AGENT_ID = 'admin')
)

流程状态/当前节点

sql
SELECT
    INS.ID AS WORKID,
    INS.STARTTIME,
    TK.NODENAME,
    BIZ.*
FROM A_BUSINESS_MAIN BIZ -- 业务表
INNER JOIN TDR_HORIZON_PAGE_DATA PD ON PD.FORM_DATA_ID = BIZ.ID
INNER JOIN TWR_HZ_INSTANCE INR ON INR.DATAID = PD.DATA_ID
INNER JOIN TW_HZ_INSTANCE INS ON INS.ID = INR.WORKID
INNER JOIN TW_HZ_TRACK TK ON INS.ID = TK.WORKID
ORDER BY INS.STARTTIME DESC

提示

若同一实例存在多条路径记录导致结果重复,可按业务需要增加 DISTINCT,或改为只取当前活动路径。

根据 pageId 查询 formId

按页面 ID 查询对应的 formId。若存在多条记录,取 版本号最大 的一条。

PAGE_ID 请替换为自己的值,对应表单设计页面 URL 上的 id

sql
SELECT
    PV.NAME AS PAGE_NAME,
    FM.NAME AS FORM_NAME,
    FM.ID AS FORMID,
    PV.PAGE_VERSION
FROM TD_HORIZON_PAGE_VERSION PV
INNER JOIN TD_HORIZON_FORM FM ON PV.ID = FM.PAGE_ID
WHERE PV.PAGE_ID = 'HZ28821887651cc601876523e89b00e1'
  AND PV.PAGE_VERSION = (
      SELECT MAX(PAGE_VERSION)
      FROM TD_HORIZON_PAGE_VERSION
      WHERE PAGE_ID = PV.PAGE_ID
  )

根据 业务ID 查询 workId

根据业务主键 ID 获取 workIdtrackId;若当前用户是主办,可从待办表取 subjectionWL 为可选关联,可能查出多条,取第一条使用。

sql
SELECT
    TK.WORKID,
    TK.ID AS TRACKID,
    CONCAT(WL.SUBJECTION_TYPE, '_', WL.SUBJECTION_ID) AS SUBJECTION
FROM TW_HZ_TRACK TK
INNER JOIN TWR_HZ_INSTANCE INR ON TK.WORKID = INR.WORKID
INNER JOIN TDR_HORIZON_PAGE_DATA PD ON INR.DATAID = PD.DATA_ID
LEFT JOIN TW_HZ_WORKLIST WL
       ON TK.WORKID = WL.WORKID
      AND WL.AUTH_ID = '当前登录人ID'
WHERE PD.FORM_DATA_ID = '业务主键ID'