SQL Server中如何按月份筛选实现自交叉连接?
实现同月份内员工表的自交叉连接
当然有可行的实现方法,你的思路方向完全正确——通过自连接并限定同月份的条件,就能精准实现每个月内部员工数据的交叉匹配。
基础实现方案
直接将表与自身做关联,把连接条件设为两张表的Month字段相等即可:
SELECT t1.Month, t1.Emp_id AS Employee_A, t2.Emp_id AS Employee_B FROM your_table_name t1 JOIN your_table_name t2 ON t1.Month = t2.Month;
这个查询会返回每个月内所有员工的两两组合,包括员工与自身的配对(比如Employee_A和Employee_B都是123的情况)。如果需要排除这种自配对记录,只需在连接条件里额外加一个判断:
SELECT t1.Month, t1.Emp_id AS Employee_A, t2.Emp_id AS Employee_B FROM your_table_name t1 JOIN your_table_name t2 ON t1.Month = t2.Month AND t1.Emp_id != t2.Emp_id;
针对日期字段的细节注意
如果你的Month字段是带具体日的日期类型(比如示例中的1/1/2017是当月第一天),而实际数据中可能存在同一个月不同日期的记录,直接用t1.Month = t2.Month会只匹配同一天的记录,而非整个月份。这时需要用数据库对应的函数提取年月来做连接条件:
- MySQL/MariaDB:
ON DATE_FORMAT(t1.Month, '%Y-%m') = DATE_FORMAT(t2.Month, '%Y-%m') - SQL Server:
ON DATEPART(YEAR, t1.Month) = DATEPART(YEAR, t2.Month) AND DATEPART(MONTH, t1.Month) = DATEPART(MONTH, t2.Month) - PostgreSQL:
ON TO_CHAR(t1.Month, 'YYYY-MM') = TO_CHAR(t2.Month, 'YYYY-MM')
结果规模验证
按照你描述的场景:每月100名员工、共12个月,用基础方案(包含自配对)的话,每个月会生成100*100=10000条记录,12个月总计12*10000=120000条记录,完全符合你的预期。如果排除自配对,每个月会生成100*99=9900条记录,总计12*9900=118800条。
内容的提问来源于stack exchange,提问作者screechOwl
相关产品推荐
相关产品推荐

