Sql 查找';最相似的';按外键显示表中的项目

Sql 查找';最相似的';按外键显示表中的项目,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,我有一个子表,对于给定的“material”(MaterialID),它有许多字符/值对。任何材质都可以有许多字符值,并且可以有几个相同的名称(参见id的2,3) 该表有大量记录(800多万条)。我想做的是找到与供应材料最相似的材料。也就是说,当我提供MaterialID时,我想要一个最相似的其他材料的有序列表(那些具有最匹配的字符/值对的材料) 我做了一些研究,但是,我可能遗漏了一些关键术语,或者只是没有正确地概念化问题 任何关于如何进行的提示都将不胜感激 ID MaterialID Ch

我有一个子表,对于给定的“material”(MaterialID),它有许多字符/值对。任何材质都可以有许多字符值,并且可以有几个相同的名称(参见id的2,3)

该表有大量记录(800多万条)。我想做的是找到与供应材料最相似的材料。也就是说,当我提供MaterialID时,我想要一个最相似的其他材料的有序列表(那些具有最匹配的字符/值对的材料)

我做了一些研究,但是,我可能遗漏了一些关键术语,或者只是没有正确地概念化问题

任何关于如何进行的提示都将不胜感激

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的字符/值对