SQL在两列匹配产品中查找所有可传递匹配项

时间:2017-09-20 03:42:15

标签: sql sql-server

我有一个产品编号表,左边的产品是右边产品的等价物。假设类似于传递属性,如果产品A与B匹配,并且B与C匹配,那么A也是C的匹配。这尽可能地扩展,如果C也匹配D,那么B和A也是D的匹配。

我试图找到一种方法,我可以通过两个列表,并使用一个标志,指出哪些产品组合在一起。

我尝试了一些自连接和交叉连接的组合,但是在太多行的产品(大约50,000)中,每个组中的匹配太多(可能是数百个)。我认为递归CTE可能是一种解决方案,但我对它们如何正常工作仍然有点模糊。

基本上,我的数据如下所示:

Product1 | Product2
  123    |   124
  124    |   126
  125    |   123
  126    |   125
  127    |   129
  128    |   127
  129    |   130
  130    |   128

在这种情况下,

123 = 124 = 125 = 126

127 = 128 = 129 = 130

因此,最终输出应如下所示:

Product | Group
  123   |   1
  124   |   1
  125   |   1
  126   |   1
  127   |   2
  128   |   2
  129   |   2
  130   |   2

我意识到SQL可能不是解决此问题的最佳应用程序,但这是整个业务流程的一部分,所有这些都在SQL中运行,所以我没有选择使用Python或者是更灵活,适合这种任务。任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:-1)

你最好构建一个无向图和DFS它,找到所有周期,每个周期都是一个组,结果就是这些组。