SQL将多条记录合并为一条默认记录

SQL将多条记录合并为一条默认记录,sql,Sql,我的“人员”表每人有一行,该人员有一个部门(不唯一)和一个公司(不唯一) 我需要加入到以下网站的p_功能、c_功能、d_功能中: people.person=p_features.num_value people.division=d_features.num_value people.company=c_features.num_value 。。。在某种程度上,如果仅在p_features/d_features/c_features中存在记录匹配,则将返回该记录,但如果该记录在2

我的“人员”表每人有一行,该人员有一个部门(不唯一)和一个公司(不唯一)

我需要加入到以下网站的p_功能、c_功能、d_功能中:

people.person=p_features.num_value  
people.division=d_features.num_value  
people.company=c_features.num_value  
。。。在某种程度上,如果仅在p_features/d_features/c_features中存在记录匹配,则将返回该记录,但如果该记录在2或3个表中,则将返回最具体的记录

例如,从下面的测试数据中,person=1的查询将返回 “错误”
第3人返回maybe,第4人返回true,第9人返回default

最大的问题是有100个特性,我有需要在一行中返回所有特性的查询。我以前的尝试是一个函数,它查询每个表中的feature、num_值,并执行foreach,但是100个features*4个表意味着400次读取,它使数据库停止,当我加载几百万行数据时,速度太慢了

create table p_features ( num_value int8, feature varchar(20), feature_value varchar(128) ); create table c_features ( num_value int8, feature varchar(20), feature_value varchar(128) ); create table d_features ( num_value int8, feature varchar(20), feature_value varchar(128) ); create table default_features ( feature varchar(20), feature_value varchar(128) ); create table people ( person int8 not null, division int8 not null, company int8 not null ); insert into people values (4,5,6); insert into people values (3,5,6); insert into people values (1,2,6); insert into p_features values (4,'WEARING PANTS','TRUE'); insert into c_features values (6,'WEARING PANTS','FALSE'); insert into d_features values (5,'WEARING PANTS','MAYBE'); insert into default_features values('WEARING PANTS','DEFAULT'); 创建表格p_要素( num_值int8, 特征varchar(20), 特征值varchar(128) ); 创建表格c_要素( num_值int8, 特征varchar(20), 特征值varchar(128) ); 创建表d_要素( num_值int8, 特征varchar(20), 特征值varchar(128) ); 创建表格默认功能( 特征varchar(20), 特征值varchar(128) ); 创建桌面人员( 个人int8不为空, 第int8部分不为空, 公司int8不为空 ); 向人们灌输价值观(4,5,6); 将价值观(3,5,6)融入到人们的生活中; 将价值观(1,2,6)融入到人们的生活中; 插入到p_特征值中(4,“穿裤子”、“真实”); 插入c_特征值(6,“穿裤子”、“假”); 插入d_特征值(5,“穿裤子”、“可能”); 插入默认_特征值(“穿裤子”、“默认”);
我不知道我是否非常理解您的问题,但要使用JOIN,您需要先加载表,然后使用SELECT语句和内部JOIN、LEFT JOIN或任何需要显示的内容。
如果您发布更多信息,可能会使其更容易理解。

我不了解您的模式的某些方面,例如,如果任何特定表中没有匹配项,如何与
默认功能表关联。唯一可能的联接条件是启用
功能
,但如果其他3个表中没有匹配项,则没有可联接的值。因此,在我的示例中,我硬编码了默认值,因为我想不出其他方法来获得它

希望这能让您开始,如果您能进一步澄清模型,那么解决方案可以改进

select p.person, coalesce(pf.feature_value, df.feature_value, cf.feature_value, 'DEFAULT')
    from people p
        left join p_features pf
            on p.person = pf.num_value
        left join d_features df
            on p.division = df.num_value
        left join c_features cf
            on p.company = cf.num_value

您需要将特征转换为具有排名的行。这里我使用了一个通用的表表达式。如果您的数据库产品不支持它们,则可以使用临时表来实现相同的效果

;With RankedFeatures As
    (
    Select 1 As FeatureRank, P.person, PF.feature, PF.feature_value
    From people As P
        Join p_features As PF
            On PF.num_value = P.person
    Union All
    Select 2, P.person, PF.feature, PF.feature_value
    From people As P
        Join d_features As PF
            On PF.num_value = P.division
    Union All
    Select 3, P.person, PF.feature, PF.feature_value
    From people As P
        Join c_features As PF
            On PF.num_value = P.company
    Union All
    Select 4, P.person, DF.feature, DF.feature_value
    From people As P
        Cross Join default_features As DF
    )
    , HighestRankedFeature As
    (
    Select Min(FeatureRank) As FeatureRank, person
    From RankedFeatures
    Group By person
    )
Select RF.person, RF.FeatureRank, RF.feature, RF.feature_value
From people As P
    Join HighestRankedFeature As HRF
        On HRF.person = P.person
    Join RankedFeatures As RF
        On RF.FeatureRank = HRF.FeatureRank
            And RF.person = P.person
Order By P.person

这太棒了。我在Informix中没有常用的表,所以我将RankedFeatures作为一个视图,所有功能都可以完美地工作。非常感谢你的努力!还有一件事,因为如果我有5个特征,我有5行,我可以把这个视图变成一个水平视图,比如:从上面的表中选择person,(特征值='佩带裤子'),(特征值='佩带帽子'),等等。。希望这是有道理的。