【发布时间】: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