Sql 查找';最相似的';按外键显示表中的项目
我有一个子表,对于给定的“material”(MaterialID),它有许多字符/值对。任何材质都可以有许多字符值,并且可以有几个相同的名称(参见id的2,3) 该表有大量记录(800多万条)。我想做的是找到与供应材料最相似的材料。也就是说,当我提供MaterialID时,我想要一个最相似的其他材料的有序列表(那些具有最匹配的字符/值对的材料) 我做了一些研究,但是,我可能遗漏了一些关键术语,或者只是没有正确地概念化问题 任何关于如何进行的提示都将不胜感激Sql 查找';最相似的';按外键显示表中的项目,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,我有一个子表,对于给定的“material”(MaterialID),它有许多字符/值对。任何材质都可以有许多字符值,并且可以有几个相同的名称(参见id的2,3) 该表有大量记录(800多万条)。我想做的是找到与供应材料最相似的材料。也就是说,当我提供MaterialID时,我想要一个最相似的其他材料的有序列表(那些具有最匹配的字符/值对的材料) 我做了一些研究,但是,我可能遗漏了一些关键术语,或者只是没有正确地概念化问题 任何关于如何进行的提示都将不胜感激 ID MaterialID Ch
ID MaterialID Charact Value
1 1 ROT_DIR CCW
2 1 SPECIAL_FEATURE CATALOG_CP
3 1 SPECIAL_FEATURE CHROME
4 1 SCHEDULE 80
5 2 BEARING_TYPE SB
6 2 SCHEDULE 80
7 3 ROT_DIR CCW
8 3 SPECIAL_FEATURE CATALOG_HSB
9 3 BEARING_TYPE SP
10 4 NDE_STYLE W_FAN
11 4 BEARING_TYPE SB
12 4 ROT_DIR CW*
您可以通过自联接来实现这一点:
select t.materialid, count(*) as nummatches
from t join
t tmat
on t.Charact = tmat.Charact and t.value = tmat.value
where tmat.materialid = @MaterialId
group by t.materialid
order by nummatches desc;
注:
- 您可能希望通过在
子句中添加where
来删除指定的材料where t.MaterialId tmat.MaterialId
- 如果需要所有材料,则将连接设为
,并将左连接
条件移动到where
子句on
- 如果只需要一种匹配最多的材质,请使用
选择top 1
- 如果希望所有材质在有领带时匹配最多,请使用“选择顶部(1)搭配领带”
select t.materialid, count(*) as nummatches
from t join
t tmat
on t.Charact = tmat.Charact and t.value = tmat.value
where tmat.materialid = @MaterialId
group by t.materialid
order by nummatches desc;
注:
- 您可能希望通过在
子句中添加where
来删除指定的材料where t.MaterialId tmat.MaterialId
- 如果需要所有材料,则将连接设为
,并将左连接
条件移动到where
子句on
- 如果只需要一种匹配最多的材质,请使用
选择top 1
- 如果希望所有材质在有领带时匹配最多,请使用“选择顶部(1)搭配领带”
- 你想让
1
|ROT_DIR
|CCW
就在3
|ROT_DIR
|CCW
的正上方吗?或者你希望得到什么结果?结果将是一个与我提供的材料最相似的材料列表。就是,;如果我提供MaterialID=1,结果将是一个与MaterialID=1的字符/值对最匹配的其他MaterialID的有序列表。您希望1
|ROT_DIR
|CCW
就在3
|ROT_DIR
CCW
的正上方吗?或者你希望得到什么结果?结果将是一个与我提供的材料最相似的材料列表。就是,;如果我提供MaterialID=1,结果将是其他MaterialID的有序列表,其中大部分匹配MaterialID=1的字符/值对