常见 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 别名约定
| 别名 | 表 |
|---|---|
WL | TW_HZ_WORKLIST(待办) |
WD | TW_HZ_WORKLIST_DONE(已办) |
INS | TW_HZ_INSTANCE(流程实例) |
INR | TWR_HZ_INSTANCE(实例与表单数据关联) |
PD | TDR_HORIZON_PAGE_DATA(页面表单业务数据关联) |
TK | TW_HZ_TRACK(活动路径) |
BIZ | 业务表(示例为 A_BUSINESS_MAIN,请替换) |
PV | TD_HORIZON_PAGE_VERSION |
FM | TD_HORIZON_FORM |
流程关联业务数据查询
以下示例演示如何关联业务表,查询「我的待办」「我的已办」(同一实例只取最新一条)、「我的申请」「结束流程」「流程状态」。
使用说明
请将示例中的业务表名、字段、FLOWID、userid 替换为实际值。关联条件统一使用 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 获取 workId、trackId;若当前用户是主办,可从待办表取 subjection。WL 为可选关联,可能查出多条,取第一条使用。
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'