2011-11-28 19 views
5

Soy muy nuevo en las secuencias de comandos de SQL y no pude encontrar la forma de hacer un específico para cada ciclo. Necesito hacer algo como esto:SQL foreach loop

Tengo Sites y SiteCrawls tablas.

Básicamente, para cada sitio necesito crear un nuevo SiteCrawl y esa SiteCrawl 's Site_ID columna será igual a la identificación de ese sitio.

¿Cómo puedo hacer esto?

+4

Una palabra: ** no lo hacen ** con un bucle foreach - SQL es ** conjunto -based ** - piensas y operas en ** conjuntos de datos **. Usar RBAR (row-by-agonizing-row) como un bucle foreach es muy malo para el rendimiento –

Respuesta

12
insert SiteCrawl 
(
    Site_ID 
) 
select 
s.Site_ID 
from Site as s 
where s.Site_ID not in (select Site_ID from SiteCrawl) 
4
insert into site_crawl (site_id) values (select site_id from site); 

Básicamente, no hay una especificación para/cada en SQL simple, maneja tablas y filas de resultados siempre como una sola declaración. Por lo tanto, también podría decir: no hay forma de que una instrucción SQL sea algo más que un for/each. Con ese conocimiento, puede ver que la consulta anterior insertará una fila en site_crawl para cada site_id en la tabla del sitio. Lo más probable es que desee utilizar más valores que este, pero dada la información de su pregunta, eso es todo lo que puedo hacer por usted :)

También: desea leer más sobre qué es sql y cómo se usa.

¡Diviértete, SQL es muy divertido!

+0

Gracias por sus comentarios. Como dije, realmente nuevo en SQL y definitivamente trabajaré en él. – ygit

1
insert into SiteCrawls (SiteID) 
select SiteID 
    from Sites 
+0

Acabo de tener el mismo problema, eso me ayudó. –

3

En SQL que normalmente no quieren a un bucle sobre cada registro. Es muy ineficiente.

Se podría hacer algo como

insert into SiteCrawl (Site_Id) 
select Id from Sites 
1

puede hacerlo por gatillo

CREATE TRIGGER tg AFTER INSERT ON `Sites` 
FOR EACH ROW 
BEGIN 
insert into SiteCrawls(Site_ID) values (NEW.id); 
END 
; 
+0

+1 es muy probable que sea excesivo para el problema dado, pero es una buena solución. –