如何用T-SQL实现同公司同合同号男女记录并排展示(无笛卡尔积)
同一公司合同号下男女记录并排展示的实现方案
核心思路:使用等值关联替代交叉连接
通过基于Company和Contract No字段的等值连接,精准匹配同一公司、同一合同号下的男女记录,从根源上避免笛卡尔积(交叉连接)产生的冗余数据。
场景1:基于已筛选的男女记录表
假设你已经拆分出两个存储男、女记录的表:male_records(男性数据)和female_records(女性数据),可以用INNER JOIN实现精准配对:
SELECT m.Company, m.`Contract No`, m.Month AS Male_Month, f.Month AS Female_Month FROM male_records m INNER JOIN female_records f ON m.Company = f.Company AND m.`Contract No` = f.`Contract No`;
如果存在某合同仅单一性别记录的情况,想要保留所有存在的记录,改用双向LEFT JOIN+UNION组合:
SELECT COALESCE(m.Company, f.Company) AS Company, COALESCE(m.`Contract No`, f.`Contract No`) AS `Contract No`, m.Month AS Male_Month, f.Month AS Female_Month FROM male_records m LEFT JOIN female_records f ON m.Company = f.Company AND m.`Contract No` = f.`Contract No` UNION SELECT COALESCE(m.Company, f.Company) AS Company, COALESCE(m.`Contract No`, f.`Contract No`) AS `Contract No`, m.Month AS Male_Month, f.Month AS Female_Month FROM female_records f LEFT JOIN male_records m ON f.Company = m.Company AND f.`Contract No` = m.`Contract No`;
场景2:直接从原表处理(无需提前拆分)
如果还未拆分男女数据,可直接在原表中筛选后关联:
SELECT m.Company, m.`Contract No`, m.Month AS Male_Month, f.Month AS Female_Month FROM (SELECT * FROM your_source_table WHERE Gender = '男') m INNER JOIN (SELECT * FROM your_source_table WHERE Gender = '女') f ON m.Company = f.Company AND m.`Contract No` = f.`Contract No`;
关键注意点
- 等值连接的条件严格限定
Company和Contract No完全匹配,只会生成符合业务逻辑的配对记录,不会产生无意义的笛卡尔积数据。 - 含空格的字段名(如
Contract No)需用反引号或双引号包裹,避免语法错误。
内容的提问来源于stack exchange,提问作者kkp0897
相关产品推荐
相关产品推荐

