>我在MySQL DB 5.5.x中有一个带有列的父表 A
Id(PK) Name Value
1 ABC 0.1
2 XYZ 0.2
3 PQR 0.3
以及引用父级 ID 的相关表 B (FK( 状态只能有 3 个可能的值,即通过、警告、错误 错误检查的优先级高于警告等
CheckName CheckStatus Id
L1 pass 1
L2 pass 1
L3 warn 1
L4 error 1
L1 pass 2
L2 warn 2
L3 pass 2
我想创建一个 SQL 语句,它可以从父表 A 获取聚合结果,以便
如果 Id 1报告了任何错误,我将 Id 1 的最终状态标记为错误,
如果未发现错误,请检查 Id 1 是否报告了针对它的任何警告,并将最终状态标记为 WARN
最后将其标记为通过。
我无法在选择的 claues 中进行简单的 JOIN 或添加案例陈述 当我开始在这里获得多行时。
我可以在不使用存储过程的情况下执行此操作吗?
基于最终选择查询中的示例数据的预期结果如下:-
Id Name FinalStatus
1 ABC error
2 XYZ warn
谢谢!
编辑: 方法1(我在这里尝试过(:
select a.Id,
case when b.CheckStatus='error' then 'ERROR'
case when b.CheckStatus='warn' then 'WARN'
case when b.CheckStatus='pass' then 'PASS'
from a join b on
a.Id=b.Id
这是一个优先级查询。 我只关注b
- 您可以使用简单的连接从a
引入列。
这适用于 MySQL 8+:
select b.*
from (select b.*,
row_number() over (partition by id
order by case checkstatus
when 'error' then 1
when 'warn' then 2
when 'pass' then 3
else 4
end
) as seqnum
from b
) b
where seqnum = 1;
在早期版本中,我会选择条件聚合:
select b.id,
max(finalstatus = 'error') as is_error,
max(finalstatus = 'warn') as is_warn,
max(finalstatus = 'pass') as is_pass
from b
group by b.id;
然后,您可以获得最终状态为:
select b.id,
(case when max(checkstatus = 'error') > 0 then 'error'
when max(checkstatus = 'warn') > 0 then 'warn'
when max(checkstatus = 'pass') > 0 then 'pass'
end) as finalstatus
from b
group by b.id;