SQL SERVER 根据时间关联两个表
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
在 SQL Server 中处理这种“月度汇总表”关联“明细事务表”的场景,最推荐、性能也最好的方法是使用区间关联(范围查询)。 由于表A的日期是当月1号,表B的日期是该月任意时间点,关联逻辑就是:判断表B的 以下是三种具体的实现方式,按推荐程度排序: 方法一:区间关联(范围查找)—— 强烈推荐利用表A的日期作为起点,计算下个月1号作为终点。这种方式能充分利用表A和表B上的索引,执行效率最高。 sql SELECT * FROM 表A A INNER JOIN 表B B ON B.input_time >= A.accounting_date AND B.input_time < DATEADD(MONTH, 1, A.accounting_date)
方法二:将表B的日期“抹平”到当月1号如果不想写范围,可以直接将表B的日期转换为月份第一天,再与表A进行等值连接。写法最直观,但无法使用表B sql SELECT * FROM 表A A INNER JOIN 表B B ON A.accounting_date = DATEFROMPARTS(YEAR(B.input_time), MONTH(B.input_time), 1) 方法三:按年月字段关联(拆解为整数)将日期转为整形的年月数字进行关联,适合数据量不大或需要分组统计的场景。 sql SELECT * FROM 表A A INNER JOIN 表B B ON YEAR(A.accounting_date) = YEAR(B.input_time) AND MONTH(A.accounting_date) = MONTH(B.input_time) 特别注意:可能出现“一对多”的情况表A每月只有1行,表B在该月可能有几千行。关联后,结果集会膨胀为表B的行数(即表A的信息会重复附在表B的每一行上)。
sql SELECT A.*, B.月度汇总值 FROM 表A A LEFT JOIN ( SELECT DATEFROMPARTS(YEAR(input_time), MONTH(input_time), 1) AS 月份, COUNT(*) AS 月度汇总值 FROM 表B GROUP BY DATEFROMPARTS(YEAR(input_time), MONTH(input_time), 1) ) B ON A.accounting_date = B.月份 结论:绝大多数生产环境中,请优先使用方法一(区间关联),它不仅逻辑严谨,而且能最大程度利用索引,扫描的数据量最小。如果你的表B数据量极大,务必确保表B的 该文章在 2026/8/3 15:12:05 编辑过 |
关键字查询
相关文章
正在查询... |