You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPMaker 2019如何通过Recordset_Selecting实现带LEFT JOIN的查询过滤

问题背景

现有Table A、Table B两张表,需过滤得到Table A中每个MyData1对应的最大RECORD_IDENTITY的去重记录,该逻辑已在Oracle SQL Developer中验证通过,但无法在PHPMaker 2019中实现。

表结构说明

Table A 字段与样例数据

RECORD_IDENTITYMyData1
1Data1_AAA
2Data1_BBB
3Data1_CCC
4Data1_AAA
5Data1_BBB
6Data1_CCC
7Data1_AAA
8Data1_BBB
9Data1_CCC

Table B 字段与样例数据

RECORD_IDENTITYMyData1
1Data1_AAA
2Data1_BBB
3Data1_CCC
4Data1_DDD
5Data1_EEE
6Data1_FFF
7Data1_GGG
8Data1_HHH
9Data1_III
预期输出
RECORD_IDENTITYMyData1
7Data1_AAA
8Data1_BBB
9Data1_CCC
已验证的Oracle SQL实现
SELECT DISTINCT 
  T1.record_identity,
  T1.MyData1
FROM  "Table A" T1
  LEFT OUTER JOIN "Table B" T2
    ON T2.MyData1 = T1.MyData1 AND T2.record_identity > T1.record_identity
WHERE (T2.record_identity IS NULL)
order by record_identity ASC;
PHPMaker 2019实现方案

方案1:通过Recordset_Selecting事件实现

  • 打开PHPMaker 2019,选中Table A,依次进入「Server Events > Table-Specific > Recordset_Selecting」编辑区域
  • 输入以下代码,Oracle环境下需将代码中反引号替换为双引号包裹带空格的表名:
// 配置JOIN关联规则
$this->setCustomJoin("LEFT OUTER JOIN `Table B` T2 ON T2.MyData1 = `Table A`.MyData1 AND T2.RECORD_IDENTITY > `Table A`.RECORD_IDENTITY");
// 添加过滤条件
AddFilter($filter, "T2.RECORD_IDENTITY IS NULL");
// 开启查询去重
$this->setDistinct(true);
// 配置排序规则
$this->setOrderBy("`Table A`.RECORD_IDENTITY ASC");
  • 保存配置后重新生成项目代码即可生效。

方案2(更简便):使用自定义视图

直接在Oracle数据库中基于上述验证通过的SQL创建查询视图,之后在PHPMaker中导入该视图作为列表页的数据源,无需编写任何事件代码,后续调整逻辑只需修改视图定义即可,维护成本更低。


内容的提问来源于stack exchange,提问作者DerKamiKatze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:36:00