mysql中UNION查询的常见问题
京东实习过程中⽤到了UNION查询,遇到不少问题,记录⼀下
这条sql语句的⼤体逻辑是这样的:需要从多张表中查询两种不同类型的数据,⽤UNION合并后,⽤动态sql语句来筛选,最后将所有数据排序
UNION查询中的字段顺序
⾸先,两条select语句合并后再⽤where来筛选数据的⽅式有两种,为了⽅便已经将字段简化,下⾯为⼀种,也可以在两条select语句中先where筛选,之后使⽤UNION合并
<select id="queryList" resultType="**VO" parameterType="**VO">sql中union多表合并
SELECT*FROM(
SELECT
IF(date_format(NOW(),'%Y-%m-%d')<![CDATA[>]]> t.end_date,TRUE,FALSE)AS overdue
FROM
task t,
objective o
WHERE
<=1
AND t.object_code = o.object_code
UNION ALL
SELECT
IF(date_format(NOW(),'%Y-%m-%d')<![CDATA[>]]> t.end_date,TRUE,FALSE)AS overdue
FROM
task t
WHERE
)AS A
WHERE
A.overdue =0
<if test="taskType != null">
AND A.task_type =#{taskType}
</if>
ORDER BY sort ASC,id ASC
</select>
上⾯的sql语句中有⼏点需要注意的:
1. 被<![CDATA[]]>这个标记所包含的内容将表⽰为纯⽂本,⽐如<![CDATA[>]]>表⽰⽂本内容“>”,因为sql语句是在xml⽂件中写
的,在xml中,”<”、”>”、”&”等字符是不能直接存⼊的
2. 第⼆条select语句中查询字段有两个null,因为union要求两个select语句的结果中的列必须是完全同名且同顺序的,但是如果列数量
不同怎么办,可以⽤null来替代,不然sql会报错The used SELECT statements have a different number of columns
3. 在使⽤union查询后排序,需要指定临时表名,即上⾯代码中的SELECT * FROM (***) AS A,不然报错Every derived table must have its
own alias
UNION和UNION ALL的区别
UNION 操作会对结果去重且排序,⽽UNION ALL会直接返回合并结果,不做处理,所以UNION ALL的速度会更快,根据需求进⾏选择
P.S. 实体类entity要根据使⽤场景不同来命名,Bo(business object)代表业务对象,Vo(value object)为值对象,通常同于和视图层进⾏交互,即后台和前端之间的传递对象,Po(persistant object)代表持久层对象的意思,对应数据库中表的字段
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论