我有两个表Material
和Mandatory
的数据库。
Mandatory
表包含两列Class
和Characteristic_Name
。
Material
表包含四列Material_Name
,Class
,Characteristic_Name
和Characteristic_value
。
我想显示Material_Name
具有相同Class
,Characteristic_Name
和Characteristic_value
的{{1}},其中Class,Characteristic_Name在Mandatory
表中相同。
例如
Material
表包含此数据
Material_Name Class Characteristic_Name Characteristic_Value
-----------------------------------------------------------------
000000001 Class1 Model 12
000000001 Class1 Size 1
000000001 Class1 Type A
000000002 Class1 Model 12
000000002 Class1 Size 1
000000002 Class1 Type A
000000003 Class2 Type B
000000003 Class2 weight 55
Mandatory
表包含以下数据:
Class Characteristic_Name
-------------------------------
Class1 Model
Class1 Size
Class1 Type
Class2 Type
Class2 weight
Material_Name 00000001和000000002是相同的,因为它们具有相同的类,Characteristics_Name和Characteristics_Value
查询将显示这些结果?
答案 0 :(得分:0)
这实际上是一个复杂的问题。如果我理解正确,您需要必需字段匹配的材料对。但是,必填字段因类而异,因此转动数据的简单解决方案不起作用。
doInBackground
CTE只获取具有所有必填字段的材料。主with m as (
select m.*
from (select m.*,
count(*) over (partition by m.material_name) as numMandatoryMatches,
numMandatory
from material m join
(select ma.*, count(*) over (partition by ma.class) as numMandatory
from mandatory ma
) ma
on m.class = ma.class and
m.Characteristic_Name = ma.Characteristic_Name
) m
where numMandatoryMatches = numMandatory
)
select m.material_name, m2.material_name
from m join
m m2
on m2.class = m.class and
m2.Characteristic_Name = m.Characteristic_Name and
m2.Characteristic_Value = m.Characteristic_Value
group by m.material_name, m2.material_name
having count(*) = max(m.nummandatoryMatches);
只是一个交叉连接,用于检查所有值是否匹配。
我应该注意,这假定特定字段不会重复特征 - 尽管可以对其进行修改以处理这种情况。