嵌套select语句

嵌套的select语句

      这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是教师实体),然后在association元素中引用此select语句(注:此方法会产生N+1问题,关于这个问题可参考本系列博客中的“MyBatis中的N+1问题”)

     association元素的属性javaType="Teacher"也可以不要,这是因为引用的select语句中已经指明了要用到的resultMap。

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.abc.mapper.StudentMapper">
<select id="getById" parameterType="int" resultMap="studentResultMap">
select id,name,gender,major,grade,supervisor_id from student where id=#{id}
</select>
<select id="selectSupervisor" parameterType="int" resultMap="supervisorResultMap">
select id,name,gender,title,research_area
from teacher where id=#{id}
</select>
<resultMap id="studentResultMap" type="Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<result property="major"  column="major"/>
<result property="grade"  column="grade"/>
<!--column="supervisor_id"不能少。此列的值作为参数
传递给要引用的select语句,用来查询相应学生的指导教师
的信息。select属性指定要引用的select语句-->
<association property="supervisor" javaType="Teacher"
column="supervisor_id" select="selectSupervisor"/>
</resultMap>
<!--教师实体映射-->
<resultMap id="supervisorResultMap" type="Teacher">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="gender" column="gender"/>
<result property="researchArea" column="research_area"/>
<result property="title" column="title"/>
</resultMap>
</mapper>


### SQL CASE WHEN 中嵌套 SELECT 子查询 在SQL中,`CASE WHEN`语句确实支持嵌套`SELECT`子查询。这使得可以根据动态获取的数据做出决策并返回相应结果。下面展示如何实现这种结构。 #### 使用 `CASE WHEN` 结合单行子查询 当需要基于某个字段的值执行不同的逻辑时,可以在`WHEN`条件部分使用子查询来决定路径: ```sql SELECT employee_id, first_name, last_name, salary, CASE WHEN (SELECT COUNT(*) FROM projects p WHERE p.manager_id = e.employee_id) > 5 THEN 'High Load' ELSE 'Normal Load' END AS project_load_status FROM employees e; ``` 此例子展示了根据每位员工管理项目的数量来标记其工作负荷状态[^3]。 #### 多行子查询配合聚合函数 有时可能希望依据一组记录的存在与否来进行分类处理,在这样的场景下可以利用存在量词(`EXISTS`)或集合成员资格测试操作符(`IN`)与多行子查询一起工作: ```sql SELECT department_id, department_name, CASE WHEN EXISTS ( SELECT 1 FROM employees ee WHERE ee.department_id = d.department_id AND ee.salary > 80000 ) THEN 'Has High Earners' ELSE 'No High Earners' END as high_earner_flag FROM departments d; ``` 上述代码片段通过检查部门内是否有薪资超过8万人民币的雇员来设置标志位[^2]。 #### 利用标量子查询返回单一值 对于那些期望得到确切数值而非布尔表达式的场合,可以通过标量子查询获得具体的结果,并将其应用于`THEN`分支中的赋值过程: ```sql SELECT order_id, customer_id, total_amount, CASE WHEN discount_code IS NOT NULL THEN (SELECT value * 0.9 FROM product_prices pp WHERE pp.product_id = o.product_id) ELSE (SELECT value FROM product_prices pp WHERE pp.product_id = o.product_id) END as final_price FROM orders o; ``` 这说明了根据不同情况调整商品最终售价的方法——如果有折扣码则给予九折优惠[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值