Preciso identificar e atualizar registros correlatos na coluna Co_Related_Item conforme descrito abaixo. O nome da tabela é CoRelated .
Explicação do cenário:
No primeiro grupo, ou seja, [GroupID] = 1 , podemos ver b=c, c=d e e=d, portanto b=c=d=e e precisam ser sinalizados 'YES'. Eles são co-relacionados. Mas x não está correlacionado a nenhum item do grupo e, portanto, é um item diferente. Então podemos ignorar este registro.
+----------+---------+-------+-------+-----------------+
| 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 |
+----------+---------+-------+-------+-----------------+
Minha primeira tentativa:
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)
Minha segunda tentativa:
adicionei uma nova coluna Flag e executei uma consulta de duas etapas conforme postado abaixo.
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
Mas estou faltando alguns itens com minhas consultas.
Nota: Eu tenho 6 milhões de registros com 300K GroupID's na minha tabela. Por favor, dê uma consulta eficiente.
Sua declaração de atualização não está cobrindo todas as possibilidades. Veja a identificação de registro 6 e 22; esses registros não são marcados.
Para ter uma consulta eficiente, você também precisa de alguns índices em sua tabela. Um que começa com coluna
GroupID
...-- parte de preparação
suas atualizações
isso é o que eu venho com:
selecione-o, com a saída:
dbfiddle aqui