PHPMaker 2019如何通过Recordset_Selecting实现带LEFT JOIN的查询过滤
问题背景
现有Table A、Table B两张表,需过滤得到Table A中每个MyData1对应的最大RECORD_IDENTITY的去重记录,该逻辑已在Oracle SQL Developer中验证通过,但无法在PHPMaker 2019中实现。
表结构说明
Table A 字段与样例数据
| RECORD_IDENTITY | MyData1 |
|---|---|
| 1 | Data1_AAA |
| 2 | Data1_BBB |
| 3 | Data1_CCC |
| 4 | Data1_AAA |
| 5 | Data1_BBB |
| 6 | Data1_CCC |
| 7 | Data1_AAA |
| 8 | Data1_BBB |
| 9 | Data1_CCC |
Table B 字段与样例数据
| RECORD_IDENTITY | MyData1 |
|---|---|
| 1 | Data1_AAA |
| 2 | Data1_BBB |
| 3 | Data1_CCC |
| 4 | Data1_DDD |
| 5 | Data1_EEE |
| 6 | Data1_FFF |
| 7 | Data1_GGG |
| 8 | Data1_HHH |
| 9 | Data1_III |
预期输出
| RECORD_IDENTITY | MyData1 |
|---|---|
| 7 | Data1_AAA |
| 8 | Data1_BBB |
| 9 | Data1_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
相关产品推荐
相关产品推荐

