la advertencia que tienes acerca de subconsultas ejecución para cada fila es cierto - para subconsultas correlacionadas .
SELECT COUNT(*) FROM Table1 a
WHERE a.Table1id NOT IN (
SELECT b.Table1Id FROM Table2 b WHERE b.id_user = a.id_user
);
Tenga en cuenta que los subconsulta hace referencia a la columna de la id_user
de la consulta externa. El valor de id_user
en cada fila de Table1
puede ser diferente. Entonces, el resultado de la subconsulta probablemente será diferente, dependiendo de la fila actual en la consulta externa. El RDBMS debe ejecutar la subconsulta muchas veces, una para cada fila en la consulta externa.
El ejemplo que ha probado es una subconsulta no correlacionada. La mayoría de los optimizadores de RDBMS modernos que valen la pena deberían ser capaces de determinar cuándo el resultado de la subconsulta no depende de los valores de cada fila de la consulta externa. En ese caso, el RDBMS ejecuta la subconsulta una sola vez, guarda su resultado en caché y lo usa repetidamente para el predicado en la consulta externa.
PD: En SQL, IN()
se denomina "predicado", no es una afirmación. Un predicado es una parte del lenguaje que se evalúa como verdadero o falso, pero no necesariamente se puede ejecutar de forma independiente como una declaración. Es decir, no puede ejecutar esto como una consulta SQL: "2 IN (1,2,3);" Aunque este es un predicado válido, no es una declaración válida.
Muy buena pregunta. No veo muchas preguntas que piden un desglose de cómo ciertas cosas en SQL realmente funcionan. Muchas veces las personas se preocupan más por obtener los resultados que desean. – TheTXI