由于HQL和SQL很像,很多功能也通用,所有,有些小伙伴直接把SQL的方法套用到HQL上,经常遇到各种报错。这次,小白又发现HQL不支持子查询操作,那么如何解决这种需求呢?
如下:想把最大年龄的人取出来 这里如下语句无论是用=或者是in都不支持
select *
from table
where age =(in) (select max(age) from table)
在HQL中会报错。
这时可以先用子查询把符合条件的取出,在用left join 或join连接该表,得到想要的结果。
select b.*
from (select max(age) as age
from table
) a
(left) join table b
on a.age = b.age
结果为:
name | age |
---|---|
张三 | 19 |
如果筛选出课程是17和18的人取出来:
select *
from table
where age in (select kecheng from tableb
where kecheng in (17,18))
如何替换呢?这时可以用到left semi join
select a.*
from table a
left semi join tableb b
on a.name = b.name
and b.kecheng in (17,18)
结果:
name | kecheng |
---|---|
李玉 | 18 |
王五 | 17 |
李四 | 17 |
这里就不能直接用left jion,如果这样的语句直接用left jion那么结果会是怎么样呢?
select a.*
from table a
left join tableb b
on a.name = b.name
and b.kecheng in (17,18)
结果为:
name | kecheng |
---|---|
李玉 | 18 |
王五 | 17 |
李四 | 17 |
张三 | 19 |
如果想用left join这时要把条件放到where中才能达到同样的效果:
select a.*
from table a
left join tableb b
on a.name = b.name
where b.kecheng in (17,18)