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

合并week1与week2查询后专属记录丢失的SQL问题求助

问题分析与解决方案

问题根源

你用LEFT JOIN合并两个查询,但WHERE子句里的week1.BERTH_YEAR = 2024和week2.BERTH_YEAR = 2024直接把只在单周存在的船只过滤掉了——毕竟只在week1有记录的船,week2的字段全是NULL,week2.BERTH_YEAR = 2024这个条件会把它排除;反过来只在week2有记录的船,也会被week1.BERTH_YEAR = 2024踢出去,最后只剩同时在两周都有记录的78条。

解决方案1:把年份条件移到JOIN的ON子句里

把年份判断放到LEFT JOIN的关联条件中,而不是WHERE里,这样就不会过滤掉左连接生成的NULL记录:

SELECT 
    BOAT.BOAT_NAME, week1.BERTH_WEEK, week2.BERTH_WEEK 
FROM 
    BOAT
LEFT JOIN 
    week1 ON BOAT.BOAT_ID = week1.BOAT AND week1.BERTH_YEAR = 2024
LEFT JOIN 
    week2 ON BOAT.BOAT_ID = week2.BOAT AND week2.BERTH_YEAR = 2024
ORDER BY 
    BOAT.BOAT_NAME;

这样查询会返回所有在week1、week2,或者两周都有记录的船只,没有数据的周对应字段会显示NULL。

解决方案2:用UNION ALL分条展示(适合不同报表需求)

如果报表需要把两周的记录分开显示,而不是同一行展示两周数据,可以用UNION ALL合并:

SELECT 
    BOAT.BOAT_NAME, week1.BERTH_WEEK, NULL AS BERTH_WEEK_W2
FROM 
    BOAT
JOIN 
    week1 ON BOAT.BOAT_ID = week1.BOAT
WHERE 
    week1.BERTH_YEAR = 2024

UNION ALL

SELECT 
    BOAT.BOAT_NAME, NULL AS BERTH_WEEK_W1, week2.BERTH_WEEK
FROM 
    BOAT
JOIN 
    week2 ON BOAT.BOAT_ID = week2.BOAT
WHERE 
    week2.BERTH_YEAR = 2024

ORDER BY 
    BOAT.BOAT_NAME;

这种方式会把week1和week2的记录分别列出,对应周没有数据的字段显示NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:32:23