我遇到了下面看起来很容易的问题,但是我找不到一个最优的方法来创建查询。
我有一个表,其中有对,并且都有一个party_id。
| 姓名|名称对|交易方标识|
| - -|- -|- -|
| A级|A1级|一个|
| A级|A2页|2个|
| A2页|C1级|三个|
| 地下二层|第一天|四个|
| 地下二层|E1级|五个|
由于[A,A1],[A,A2],[A2,C1],其意味着**[A,A1,A2,C1]应该在一起,并且公共party_id应该是所有这些party_id的最小值,因此1**A-〉A,A1,A2-〉C1 -〉A,A1,A2,C1
对方为[B2,D1,E1] -〉4
我希望看到的结果:
| 姓名|名称对|交易方标识|结果|
| - -|- -|- -|- -|
| A级|A1级|一个|一个|
| A级|A2页|2个|一个|
| A2页|C1级|三个|一个|
| 地下二层|第一天|四个|四个|
| 地下二层|E1级|五个|四个|
首先我试着交叉加入,但它只sloves直到党的大小是2...
速度很重要,因为此表有数百万行。
1条答案
按热度按时间2mbi3lxu1#
就我对您的情况的理解,您需要一个递归查询,因为C1是A2的对,A2是A的对。下面是一个需要花费一些时间的解决方案,因为它需要在递归查询的第一部分扫描整个表,即使列
name
上存在索引,并且应该由查询计划器在第二部分使用:请参见dbfiddle中的测试结果