Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-02-2006
Sinonimo Sinonimo is offline
Registrado
 
Registrado: feb 2006
Posts: 5
Poder: 0
Sinonimo Va por buen camino
Optimización de Querys Anidados

Supongo que más de una persona en este foro se ha visto enredado en algún momento de su vida con los querys anidados.
Navegando un poco me encontré con esta técnica, que utilizándola a niveles mayores, me ha ahorrado muchísimo trabajo, y más de un dolor de cabeza.
Cabe señalar que ya había llegado yo a una conclusión cercana, aunque no había dado con la solución completa.


Esto está explicado en el librito Optimizing Transact-SQL, pero vale la pena comentarlo:
Supongamos que tengo una tabla con una columna numérica, y quiero el máximo que es menor a un número K dado: la solución obvia es:
select max(foo) from bar where foo < Kpero no sirve si quiero traer otras columnas.
Para fijar ideas, supongamos que tengo la tabla Comisiones con campos Nivel y Porcentaje, y la consulta típica es: seleccionar el Porcentaje de Comisiones para el máximo Nivel (notar cómo la condicion establece un piso) menor a un K dado. La segunda solución obvia es:
select Porcentaje from Comisiones where Nivel = (select max(Nivel) from Comisiones where Nivel < K)El truco para eliminar el select anidado es este: el where filtra filas, y el having filtra grupos. Pero no hace falta tener grupos; la tabla completa es, conceptualmente, un grupo. Entonces, esta consulta hace lo mismo:
select Porcentaje from Comisiones where Nivel < K having Nivel = max(Nivel)Cuidado, porque si tengo más condiciones, tengo que pensar qué condiciones corresponden a la fila y qué condiciones corresponden al grupo. Por ejemplo, supongamos que la tabla además tiene una columna Plan, que puede ser 1, 2 ó 3. Si quiero seleccionar el Porcentaje de Comisiones para el Plan 3 con Nivel menor a K, la condición Plan < 3 va en el having, y no en el where:
select Porcentaje from Comisiones where Nivel < K having Plan = 3 and Nivel = max(Nivel)Alternativamente, puedo agrupar explícitamente:
select Porcentaje from Comisiones where Plan = 3 and Nivel < K group by Plan having Nivel = max(Nivel)Buscar techos es el problema inverso: es el mínimo Nivel mayor a uno dado.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Clientdatasets anidados con ADO Johnny Q Conexión con bases de datos 4 03-11-2005 02:53:25
cuantos querys???? kryna Conexión con bases de datos 5 09-05-2005 20:50:13
Como funciona las Querys? diegofhernando Firebird e Interbase 6 09-09-2004 18:56:52
Eliminar del memoria los querys Aura OOP 4 01-04-2004 17:40:40
Pregunta MUY tonta sobre querys NeWsP SQL 6 18-01-2004 03:33:10


La franja horaria es GMT +2. Ahora son las 16:35:56.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi