You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单SQL查询中计算两类蛋白质的平均长度并合并结果

合并蛋白质平均长度统计结果的SQL实现方案

方法一:条件聚合(推荐,单表扫描效率更高)

通过CASE语句结合AVG()聚合函数,一次扫描蛋白质表即可同时计算两类平均值,结果以列的形式展示:

SELECT
  -- 计算存在于mrna_pieces表的蛋白质平均长度
  AVG(CASE 
        WHEN EXISTS (SELECT 1 FROM mrna_pieces mp WHERE mp.protein_id = p.protein_id) 
        THEN p.length 
      END) AS avg_length_in_mrna,
  -- 计算不存在于mrna_pieces表的蛋白质平均长度
  AVG(CASE 
        WHEN NOT EXISTS (SELECT 1 FROM mrna_pieces mp WHERE mp.protein_id = p.protein_id) 
        THEN p.length 
      END) AS avg_length_not_in_mrna
FROM proteins p;

方法二:UNION ALL合并独立查询

如果更习惯用独立查询的逻辑,可通过UNION ALL将两个统计结果合并为两行展示:

-- 统计存在于mrna_pieces的平均长度
SELECT '存在于mrna_pieces' AS category, AVG(p.length) AS avg_length
FROM proteins p
WHERE EXISTS (SELECT 1 FROM mrna_pieces mp WHERE mp.protein_id = p.protein_id)

UNION ALL

-- 统计不存在于mrna_pieces的平均长度
SELECT '不存在于mrna_pieces' AS category, AVG(p.length) AS avg_length
FROM proteins p
WHERE NOT EXISTS (SELECT 1 FROM mrna_pieces mp WHERE mp.protein_id = p.protein_id);

常见错误原因

你遇到的syntax error at or near "WHERE"错误,大概率是因为直接拼接两个查询时未使用UNION ALL关键字,或者在单个查询中重复使用WHERE子句。比如错误写法示例:

-- 错误:两个查询直接拼接,无UNION ALL连接
SELECT AVG(length) FROM proteins WHERE EXISTS (...)
SELECT AVG(length) FROM proteins WHERE NOT EXISTS (...)

-- 错误:单个查询中重复使用WHERE
SELECT AVG(length) FROM proteins 
WHERE EXISTS (...)
WHERE NOT EXISTS (...)

内容的提问来源于stack exchange,提问作者Koenvc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:45:13