如何用SQL查询指定公司消息:缺失类型取空company_id记录
解决方案
完全可以用SQL实现这个需求,核心思路是先确保覆盖所有需要的消息类型,再优先选取目标公司的记录,缺失时用company_id为NULL的对应类型记录补充。
实现SQL
WITH required_types AS ( -- 定义所有需要覆盖的消息类型 SELECT 'new_contract' AS type UNION ALL SELECT 'new_offer' AS type ), company_records AS ( -- 获取company_id=1的所有记录 SELECT * FROM messages WHERE company_id = 1 ), null_records AS ( -- 获取company_id为NULL的所有记录 SELECT * FROM messages WHERE company_id IS NULL ) SELECT -- 优先取公司1的id,没有则取NULL记录的id COALESCE(c.id, n.id) AS id, COALESCE(c.en, n.en) AS en, rt.type, -- 公司1的记录保留原company_id,补充的记录为NULL c.company_id FROM required_types rt LEFT JOIN company_records c ON rt.type = c.type LEFT JOIN null_records n ON rt.type = n.type WHERE -- 确保至少有公司记录或NULL记录存在(根据业务场景可调整) (c.id IS NOT NULL OR n.id IS NOT NULL);
逻辑说明
- required_types:用
UNION ALL生成所有需要覆盖的消息类型列表,确保不会遗漏任何类型。 - company_records:筛选出目标公司(company_id=1)的所有记录。
- null_records:筛选出
company_id为NULL的所有记录。 - 主查询通过左连接将类型列表与公司记录、NULL记录关联,用
COALESCE函数优先选取公司记录的字段,当公司没有对应类型记录时,自动取NULL记录的对应字段。
测试验证
用你提供的示例数据执行该SQL,会返回:
- 记录1:
id=1, en='new contract', type='new_contract', company_id=1 - 记录3:
id=3, en='new offer', type='new_offer', company_id=NULL
完全符合期望输出。
内容的提问来源于stack exchange,提问作者Bisher
相关产品推荐
相关产品推荐

