找到最相似的'外键表中的项目

时间:2016-09-13 14:24:37

标签: sql tsql sql-server-2012

我有一个子表,其中包含一些特定'材料的特征/值对。 (MaterialID)。任何材料都可以有多个charact值,并且可能有几个相同的名称(参见id' s 2,3)。

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

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

非常感谢任何关于如何解决这个问题的提示。

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*

1 个答案:

答案 0 :(得分:2)

您可以使用自我加入来执行此操作:

orWhere

注意:

  • 您可能希望通过将$results = EvidenceFile::whereNotIn('id', $exclude_file_ids) ->where(function ($query) use ($user_id) { $query->where('owner_id', $user_id) ->orWhere('public', '1'); }) ->get(); 添加到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 t.MaterialId <> tmat.MaterialId并将where条件移至left join子句。
  • 如果您只想要一种匹配最多的资料,请使用where
  • 如果你想要有关系时匹配最多的所有材料,请使用`select top(1)with ties。