Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: coco en Julio 13, 2012, 10:21:19 am
-
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 :D
Gracias!
-
Parece medio rebuscada tu forma de enlazar los datos x'D pero antes que nada, que motor es?
Ademas no podes usar variables/cursores tipo para no estar haciendo COUNT() ... consume tiempo :P
Y otra cosa, no podes quitar el group by? no le encuentro la razon porque no haces nada que no sea grupal excepto el count :/
-
es que necesito que el count sea para ESE grupo :D. entonces me dice cuantos otros registros hay en cada "ref_key" distinto