cxn 发表于 2019-3-11 18:08

islxyqwe 发表于 2019-3-11 18:19

本帖最后由 islxyqwe 于 2019-3-11 18:21 编辑

风怒

北海生未径 发表于 2019-3-11 18:19

嵌套

islxyqwe 发表于 2019-3-11 18:20

mysql要写子查询。先把三个表串起来按a.id分组取id和max(c.value),再串回去把其他的项取出来就行了。postgres可以直接按id取以value排序的rownumber然后过滤出rownumber为1即可。

alvin051414 发表于 2019-3-11 18:59

本帖最后由 alvin051414 于 2019-3-11 20:25 编辑

--a表数据可靠的话
--标准sql
select
a.id,
a.name,
case when sub_a.max_value is null then 0 else sub_a.max_value end as highest,
case when sub_b.max_value is null then 0 else sub_b.max_value end as highestFullTime
from a
left join
(select b.aid,max(c.value) as max_value from b left join c on b.level=c.level group by b.aid) sub_a
on a.id=sub_a.aid
left join
(select b_full.aid,max(c.value) as max_value from (select * from b where type='全日制')b_full
left join c on b_full.level=c.level group by b_full.aid) sub_b
on a.id=sub_b.aid

--Oracle SQL之类的可以写的更漂亮
select
a.id,
a.name,
nvl(max(c.value),0) as highest,
max(decode(b.type,'全日制',c.value,0)) as highestFullTime
from a
left join b on a.id=b.aid
left join c on b.level=c.level
group by a.id,a.name

--ab表缺数据的话就刺激了,要outer join再加一堆case when或者nvl2了
--s1这代码模式不兼容case when的么…

hamano_taiki 发表于 2019-3-11 19:03

本帖最后由 hamano_taiki 于 2019-3-11 19:05 编辑

select
a.id,
a.name,
max(c.value) as hightest,
h.value as hightestFullTime
from a
left join b on a.id=b.id
left join c on b.level=c.level
left join
(select
a.id,
max(c.value) as value
from a
left join b on a.id=b.id
left join c on b.level=c.level
where b.type="全日制"
group by a.id)
group by a.id

Lucassen 发表于 2019-3-11 19:09

lancherliu 发表于 2019-3-11 19:48

完了,完全忘了,这才两年不用sql

-- 来自 能看大图的 Stage1官方 Android客户端

赤色彗星SEXY 发表于 2019-3-12 00:22

mysql这种没窗口函数的渣渣这种时候特别烂

-- 来自 能搜索的 Stage1官方 Android客户端
页: [1]
查看完整版本: 请教一句sql select的写法