【问题标题】:SQL Find all transitive matches throughout two columns of matching products [duplicate]SQL在两列匹配产品中查找所有传递匹配[重复]
【发布时间】:2017-09-20 03:42:15
【问题描述】:

我有一个产品编号表,其中左侧的产品与右侧的产品相同。假设类似于传递属性,如果产品 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 或更灵活的东西并且适合这种任务。任何帮助将不胜感激。

【问题讨论】:

  • 如果我没记错的话,这个问题和here问的很相似。这个问题有两个答案:一个是递归 CTE,一个是更复杂的。它们都给出了正确的输出,请注意,对于非常大的输入集,复杂的答案(我的;))会表现得更好。
  • 太棒了!根据帖子,输出正是我正在寻找的。我需要一些时间来完成它并了解它是如何工作的,但是知道解决方案的存在真是一种解脱。
  • 很高兴听到这个消息。

标签: sql sql-server


【解决方案1】:

你最好构造一个无向图并对其进行DFS,找到所有的循环,每个循环是一个组,结果就是这些组。

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多