Hola,
Estoy probando algunas cosas, y desarrollando otras, y surge la necesidad de hacer lo siguiente:
Tengo una tabla llamada "tags", estructura:
id (INT) | ref_key (INT) | tag (TEXT)
y otra llamada "matches", estructura:
key1 (INT) | key2 (INT) | matc_count (INT)
En la primera tabla (tags) tengo guardado miles de registros, de los cuales, algunos comparten el "ref_key", ya que eso los vincula entre si.
La idea de esto es, agarrando los registros que tengan el mismo "ref_key", buscar TODOS los otros registros que compartan algun "tag" y agregarlo en la otra tabla. Tambien recolectando la cantidad de "tag" en comun.
Hasta ahora lo hago asi:
(por cada "ref_key" distinto, voy generando estas instrucciones)
INSERT INTO matches (key1, key2, match_count) SELECT [key], ref_key, count(ref_key) as match_cnt FROM tags WHERE tag IN ([tags]) AND ref_key <> [key] GROUP BY ref_key ORDER BY match_cnt DESC; donde [key] es reemplazado en VB por un long, y [tags] por una lista de elementos.
EJ:
INSERT INTO matches (key1, key2, match_count) SELECT 1507, ref_key, count(ref_key) as match_cnt FROM tags WHERE tag IN ("vilma", "palma", "e", "vampiros", "verano", "traidor", "3980") AND ref_key <> 1507 GROUP BY ref_key ORDER BY match_cnt DESC; Obviamente antes de empezar el bucle, se comienza una transaccion, sino seria moustroso el tiempo que tardaria. (y al finalizar, se commitea)
La cosa es que es medio lerdo esto, y no se porque. Recien agregue 20k de elementos en menos de 1s (mediante otro procedimiento, y para otro motivo), y esto tardo aproximadamente 50 minutos (34350582 registros en total).
Algo que en mi codigo NO hice y NO pude hacerlo, es que el "match_cnt" DEBE ser mayor que X (una constante que se puede reemplazar desde VB). No me deja hacerlo ya que dice que con el GROUP BY no es valido.
Acudo a su ayuda

Gracias!