update QDS_H_REPORT_DAY_ACCOUNT d set JFDL = select long_sum as long_sum from (select a.id,a.belong_day, a.plant_id, a.plant_name, a.day_account, b.long_sum,a.belong_com from (select round(sum( nvl(SP_01113101180001,0) ) / 60, 4) as long_sum, belong_day from QDS_H_POWER_LONG_2023 group by belong_day) b, (select id,belong_day, plant_id,'SP_'||plant_id as spid, plant_name, day_account,belong_com from QDS_H_REPORT_DAY_ACCOUNT where IZ_DEL = 0) a where a.belong_day = b.belong_day and a.spid = 'SP_01113101180001' and a.belong_com = '青浦地调') c where d.plant_id = '01113101180001' and d.belong_day = c.belong_day
时间: 2024-03-29 13:41:49 浏览: 94
这是一条 SQL 语句,用于更新表 QDS_H_REPORT_DAY_ACCOUNT 中的 JFDL 字段。具体操作为,从表 QDS_H_POWER_LONG_2023 中查询出 SP_01113101180001 对应的 long_sum 值,并将其与 QDS_H_REPORT_DAY_ACCOUNT 中的 day_account 字段相加得到新的 JFDL 值。其中,belong_day、plant_id、belong_com 分别是 QDS_H_REPORT_DAY_ACCOUNT 和 QDS_H_POWER_LONG_2023 表中的共同字段,用于关联两个表的数据。最后通过 where 子句指定要更新的记录。
相关问题
SELECT ROUND( <foreach collection="list" item="spid" separator="+" open="sum(" close=")"> ${spid} </foreach> /${dayCountByMonth}/${list.size}/1440,5) FROM QDS_H_POWER_LONG_${year} WHERE BELONG_DAY between #{lastMonthOne} and #{lastMonthLast}
这是一个SQL查询语句,根据你提供的信息,我将对其进行解析。
这个查询语句的目的是计算一个值,该值是由以下表达式计算得出的:将列表中的每个元素相加,然后除以 `${dayCountByMonth}`、`${list.size}` 和 1440 的乘积,最后将结果四舍五入保留5位小数。
这个查询语句还包含了一个表名的占位符 `${year}`,你需要将其替换为特定年份的实际表名。
最后,查询语句还包含了一个条件:`BELONG_DAY` 的取值范围在 `#{lastMonthOne}` 和 `#{lastMonthLast}` 之间。你需要将这两个占位符分别替换为特定日期的实际值。
请注意,这只是对查询语句的解析,具体实现取决于你所使用的数据库和编程语言。
@Override public Page<NicheMobileEntity> h5PageList(Page<NicheMobileEntity> page, NicheVO vo) { if (vo.getCompanyArea() != null && ("QDS").equals(vo.getCompanyArea())){ vo.setCompanyArea(""); } QueryWrapper<NicheMobileEntity> wrapper = new QueryWrapper<>(); UserVO user = nicheMapper.getSendUserByNo(SecurityUtils.getCurrentUserNo()); String userNo = user.getEmployeeNo(); //查询当前登录用户的角色是否含有省公司领导角色、分公司领导角色 List<String> roleName = nicheMapper.getRoleNamesByUserId(SecurityUtils.getCurrentUserId()); if(roleName.contains("省公司领导") || roleName.contains("分公司领导")){ if (vo.getMainSend() != null && vo.getMainSend() && vo.getCopySend() != null && vo.getCopySend()) { wrapper.and(item -> item.apply( "FIND_IN_SET({0},copy_user_nos)", userNo).or().eq("main_user_no", userNo)); }else if (vo.getMainSend() != null && vo.getMainSend()){ wrapper.eq("main_user_no", userNo); }else if (vo.getCopySend() != null && vo.getCopySend()){ wrapper.and(item -> item.apply("FIND_IN_SET({0}, copy_user_nos)", userNo)); } }else { wrapper.and(item -> item.apply( "FIND_IN_SET({0},copy_user_nos)", userNo).or().eq("main_user_no", userNo)); } //wrapper.eq(vo.getCustomerId()!=null,"t.customer_id",vo.getCustomerId()); wrapper.like(StringUtils.isNotEmpty(vo.getCustomerName()), "s.company_name", vo.getCustomerName()); if (ObjectUtils.isNotEmpty(vo.getStatus())) { wrapper.eq(ObjectUtils.isNotEmpty(vo.getStatus()), "t.status", vo.getStatus()); } else { String[] statusArr = new String[]{ NicheStateEnum.PUSHED.getState(), NicheStateEnum.WAIT_VISIT.getState(), NicheStateEnum.WAIT_TRACE.getState(), NicheStateEnum.WAIT_TRANSFORM.getState(), NicheStateEnum.TRANSFORMED.getState(), NicheStateEnum.END.getState()}; wrapper.in("t.status", statusArr); } //只有主送和抄送都没有勾选时,加上地区条件限定 if(vo.getCopySend() != null && vo.getMainSend() != null){ if (!vo.getMainSend() && !vo.getCopySend()){ wrapper.eq(StringUtils.isNotEmpty(vo.getCompanyArea()), "s.company_area", vo.getCompanyArea()); } } wrapper.eq(StringUtils.isNotEmpty(vo.getCompanyIndustry()), "s.company_industry", vo.getCompanyIndustry()); wrapper.eq(StringUtils.isNotEmpty(vo.getDataSource()), "t.data_source", vo.getDataSource()); wrapper.between(vo.getStartTime() != null, "t.create_time", vo.getStartTime(), vo.getEndTime()); // if (!"admin".equals(username)) { // wrapper.and(item -> item.apply( // "FIND_IN_SET({0},copy_user_nos)", userNo).or().eq("main_user_no", userNo)); // } wrapper.orderByDesc("t.update_time"); List<NicheMobileEntity> list = nicheMapper.selectH5PageList(page, wrapper).getRecords(); list.forEach(e -> { if (e.getMainUserNo() != null && e.getMainUserNo().toLowerCase().contains(userNo.toLowerCase())) { if (e.getCopyUserNos() != null && e.getCopyUserNos().toLowerCase().contains(userNo.toLowerCase())) { e.setSendUserType("3"); } else { e.setSendUserType("1"); } } else { if (e.getCopyUserNos() != null && e.getCopyUserNos().toLowerCase().contains(userNo.toLowerCase())) { e.setSendUserType("2"); } } }); return page.setRecords(list); } 当wrapper走到下面的分支,会不会导致后面的条件失效,wrapper.and(item -> item.apply( "FIND_IN_SET({0},copy_user_nos)", userNo).or().eq("main_user_no", userNo));
<think>嗯,用户问的是当wrapper走到某个特定分支时,后面的条件会不会失效。具体来说,他们担心在使用了wrapper.and(item -> ...)之后,后续添加的条件是否会被覆盖或者忽略。我需要仔细分析这段代码,看看MyBatis-Plus的QueryWrapper是如何处理多个条件的。
首先,用户提供的代码中,当用户角色是省公司或分公司领导时,根据vo中的mainSend和copySend参数的不同组合,会添加不同的条件。比如,当两者都为true时,会执行wrapper.and(...),里面用or连接两个条件。否则,单独添加eq或apply条件。而如果角色不是领导,同样会添加一个and条件,里面包含or。
用户担心的是,这些and条件是否会覆盖后面添加的其他条件,比如后面的wrapper.like、wrapper.eq等。根据MyBatis-Plus的文档,QueryWrapper的条件是逐步添加的,默认使用AND连接,除非使用or()方法。而使用and()方法实际上是在当前条件中嵌套一个新的逻辑组,不会影响后续的条件。例如,当执行wrapper.and(...)时,这个条件会被添加到现有的条件中,用AND连接,而后续的条件同样会被AND连接起来。
接下来,需要确认在代码中,后续的条件是否会被正确添加到wrapper中。例如,在添加了wrapper.and(...)之后,后面的wrapper.like、wrapper.eq等是否继续以AND连接。根据MyBatis-Plus的逻辑,是的,它们会被顺序添加,并且用AND连接,除非显式地使用or()。
然后,用户提到的特定分支中的wrapper.and(item -> ...),这个条件会被包装成一个AND组,然后后续的条件继续追加,所以后面的条件不会失效,而是作为额外的AND条件附加到整个查询中。例如,假设原来的SQL已经有了条件A,然后添加了AND (B OR C),接着添加了LIKE D,那么最终的SQL会是A AND (B OR C) AND D。
需要检查代码中的各个条件添加的顺序,是否在同一个wrapper实例中连续调用。是的,所有条件都是同一个wrapper,所以后续的条件都会追加到WHERE子句中。因此,用户担心的条件失效的情况不会发生,后续的条件仍然有效,并且以AND连接。
不过,需要注意在MyBatis-Plus中,如果多次调用and()方法,可能会影响条件组合。例如,在已有的条件中使用and()会创建一个新的嵌套条件,但在这个代码中,每次调用都是直接对wrapper进行操作,因此后续的条件会继续追加,不会覆盖之前的。
总结来说,当进入该分支并添加了.and(...)后,后面的条件仍然会被添加到wrapper中,不会导致失效。整个SQL会将这些条件用AND连接起来,形成正确的查询语句。</think>这个问题的核心在于理解MyBatis-Plus的`QueryWrapper`条件拼接逻辑。以下是逐步分析:
---
### **一、条件失效的可能性判断**
当执行`wrapper.and(item -> ...)`分支时,**不会导致后续条件失效**。因为:
1. **`and()`方法本质是逻辑与操作**
- 每次调用`and()`会在原有条件基础上**新建嵌套条件组**,不会覆盖已存在的条件
- 示例:假设已有条件`A`,调用`.and(B OR C)`后,实际生成`A AND (B OR C)`
2. **后续条件仍然会追加**
- 后续的`wrapper.like()`/`wrapper.eq()`等方法会继续以`AND`连接
- 例如:
```sql
WHERE [原有条件]
AND (FIND_IN_SET(...) OR main_user_no = ...) # 当前分支的条件
AND s.company_name LIKE ... # 后续的like条件
AND t.status IN ... # 后续的in条件
```
---
### **二、代码执行流程验证**
我们通过具体场景验证条件拼接(以省公司领导角色分支为例):
#### **场景1:同时勾选主送和抄送**
```java
if (vo.getMainSend() && vo.getCopySend()) {
wrapper.and(item -> item.apply(...).or().eq(...));
}
```
**生成的SQL结构**:
```sql
WHERE
(FIND_IN_SET(?, copy_user_nos) OR main_user_no = ?) -- 当前分支的条件
AND s.company_name LIKE ? -- 后续的like条件
AND t.status IN (?,?,...) -- status过滤
AND ... -- 其他条件
```
#### **场景2:仅勾选主送**
```java
else if (vo.getMainSend()) {
wrapper.eq("main_user_no", userNo);
}
```
**生成的SQL结构**:
```sql
WHERE
main_user_no = ? -- 当前分支的条件
AND s.company_name LIKE ? -- 后续的like条件
AND t.status IN (?,?,...) -- status过滤
AND ... -- 其他条件
```
---
### **三、关键代码段解析**
```java
// 分支逻辑(不会覆盖后续条件)
if(roleName.contains("省公司领导") || roleName.contains("分公司领导")){
// 条件1:根据勾选状态动态拼接
} else {
// 条件2:默认拼接OR逻辑
}
// 后续条件仍然有效(AND连接)
wrapper.like(...);
wrapper.eq(...);
wrapper.between(...);
```
---
### **四、总结**
1. **条件叠加特性**
MyBatis-Plus的`QueryWrapper`采用链式调用设计,所有条件会通过`AND`连接**按顺序叠加**,不存在条件覆盖问题。
2. **特殊注意事项**
如果代码中出现`.or()`操作,需要确保其作用域正确。但在当前代码中:
- 所有`.or()`都包裹在`.and(item -> {})`的lambda表达式内
- 不会影响后续条件逻辑
3. **验证方法建议**
可以通过以下方式验证最终SQL:
```java
System.out.println(wrapper.getSqlSegment()); // 打印实际生成的WHERE条件
```
---
**结论**:该分支中的`wrapper.and(...)`不会导致后续条件失效,所有条件会以`AND`逻辑正确拼接。
阅读全文
相关推荐















