在SQL Server中的两个表中查找重复的行

时间:2017-04-14 13:50:33

标签: sql-server database

我有两个表MaterialMandatory的数据库。

Mandatory表包含两列ClassCharacteristic_Name

Material表包含四列Material_NameClassCharacteristic_NameCharacteristic_value

我想显示Material_Name具有相同ClassCharacteristic_NameCharacteristic_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

查询将显示这些结果?

1 个答案:

答案 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); 只是一个交叉连接,用于检查所有值是否匹配。

我应该注意,这假定特定字段不会重复特征 - 尽管可以对其进行修改以处理这种情况。