SQL谜题:为所有二元特征补全car_features表缺失行(优先DB2)
补全car_features表的DB2解决方案
前提假设表结构
先明确三张表的典型结构(如果你的表结构不同,可根据实际调整字段关联逻辑):
car_owners:包含car_id(车辆唯一标识)、owner_id等字段car_features_codes:包含feature_group(特征组,共4组)、code_type(正向'POS'/负向'NEG')、feature_code(特征编码值)字段car_features:包含car_id、feature_code字段
DB2实现SQL
WITH required_feature_groups AS ( -- 提取所有4个特征组 SELECT DISTINCT feature_group FROM car_features_codes ), all_car_feature_groups AS ( -- 生成每辆车对应4个特征组的完整组合(最终需要的记录框架) SELECT co.car_id, rfg.feature_group FROM car_owners co CROSS JOIN required_feature_groups rfg ), existing_car_features AS ( -- 关联现有特征记录到对应的特征组 SELECT cf.car_id, cfc.feature_group, cf.feature_code FROM car_features cf JOIN car_features_codes cfc ON cf.feature_code = cfc.feature_code ), missing_features AS ( -- 找出缺失的特征记录,用对应组的负向编码填充 SELECT acfg.car_id, (SELECT feature_code FROM car_features_codes WHERE feature_group = acfg.feature_group AND code_type = 'NEG') AS feature_code FROM all_car_feature_groups acfg LEFT JOIN existing_car_features ecf ON acfg.car_id = ecf.car_id AND acfg.feature_group = ecf.feature_group WHERE ecf.feature_code IS NULL ) -- 插入缺失的特征记录 INSERT INTO car_features (car_id, feature_code) SELECT car_id, feature_code FROM missing_features;
逻辑说明
- required_feature_groups:从特征编码表中提取唯一的4个特征组,确保覆盖所有需要补全的特征类别。
- all_car_feature_groups:通过笛卡尔积将每辆车与4个特征组配对,生成最终需要的完整记录集合(车辆数×4条)。
- existing_car_features:把现有
car_features的记录关联到对应的特征组,方便对比找出缺失项。 - missing_features:左连接完整组合与现有记录,筛选出未存在的条目,并自动获取对应特征组的负向编码作为默认值。
- INSERT语句:将缺失的记录插入到
car_features中,保留原有行的同时补全所有缺失特征。
其他SQL方言适配
如果使用PostgreSQL、MySQL等其他数据库,上述逻辑基本通用,仅需确认CTE(WITH子句)是否被支持(现代数据库均支持),若不支持CTE,可将子查询嵌套使用。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

