我需要识别和更新Co_Related_Item列下的共同相关记录,如下所示。表名是CoRelated。
场景解释:
在第一组中,即[GroupID] = 1,我们可以看到b=c、c=d 和 e=d,因此b=c=d=e并且需要标记为“是”。它们是相互关联的。但是x与组中的任何项目都不相关,因此它是一个不同的项目。所以我们可以忽略这条记录。
+----------+---------+-------+-------+-----------------+
| Required result|
+----------+---------+-------+-------+-----------------+
| UniqueID | GroupID | Item1 | Item2 | Co_Related_Item |
+----------+---------+-------+-------+-----------------+
| 1 | 1 | x | | |
| 2 | 1 | b | c | YES |
| 3 | 1 | c | d | YES |
| 4 | 1 | d | | YES |
| 5 | 1 | e | d | YES |
| 6 | 1 | e | | YES |
| 7 | 1 | e | c | YES |
--------------------------------------------------------
| 8 | 2 | a | | |
| 9 | 2 | b | | |
--------------------------------------------------------
| 10 | 3 | x | | |
| 11 | 3 | y | | |
| 12 | 3 | a | b | YES |
| 13 | 3 | b | | YES |
--------------------------------------------------------
| 14 | 4 | x | | |
| 15 | 4 | y | | |
| 16 | 4 | x | | |
| 17 | 4 | c | | YES |
| 18 | 4 | d | | YES |
| 19 | 4 | d | c | YES |
--------------------------------------------------------
| 20 | 5 | a | c | YES |
| 21 | 5 | b | c | YES |
| 22 | 5 | b | | YES |
| 23 | 5 | c | | YES |
+----------+---------+-------+-------+-----------------+
我的第一次尝试:
Update a SET a.Co_Related_item = 'Y' from CoRelated a inner join CoRelated b on a.[GroupID] = b.[GroupID] and (a.Item1 = b.Item2 or b.item1 = a.Item2)
我的第二次尝试:
我添加了一个新列Flag并执行了如下所示的两步查询。
1)
Update a SET a.Flag = b.Item1 from CoRelated a inner join CoRelated b on a.[GroupID] = b.[GroupID] where (a.Item1 = b.Item2 or b.item1 = a.Item2)
2)
Update a SET a.Flag = b.Item1 from CoRelated a inner join CoRelated b on a.[GroupID] = b.[GroupID] and (a.Item1 = b.Flag or a.item2 = b.Flag)
where a.Flag is null
但是我的查询遗漏了一些项目。
注意:我的表中有 600 万条记录和 300K GroupID。请给出一个有效的查询。
您的更新声明并未涵盖所有可能性。见记录 id 6 和 22;这些记录没有标记。
为了有一个有效的查询,你还需要在你的表上有一些索引。以 column 开头的
GroupID
...--准备部分
你的更新
这就是我带来的:
选择它,输出:
dbfiddle在这里