Ver Mensaje Individual
  #3 (permalink)  
Antiguo 29/08/2010, 02:17
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Duda!! Con algo que me parece extraño! Me ayudan?

Hola,

Posiblemente,

Cita:
Iniciado por in_rainbows Ver Mensaje
... SI DE TODAS MANERAS EN LAS DOS SENTENCIAS MANDO LLAMAR A LA MISMA COLUMNA REFERENCIADA DE LA MISMA TABLA.. SE SUPONE QUE SON LOS EQUIVALENTES NO? PORQUE MARCA ERROR EN UNA Y EN OTRA NO? ...
Eso no es completamente cierto, la columna es la misma, pero se evalúa de una forma completamente diferente dependiendo si tiene el prefijo TP de la consulta 'externa' en la subconsulta.

Cita:
Iniciado por in_rainbows Ver Mensaje
... SI LE CAMBIO A MI QUERY EL TP.EMPRESA = 'EQUIS' QUITANDOLE EL ALIAS DEJANDOLO ASI EMPRESA = 'EQUIS'.. YA NO ME MARCA EL ERROR ...
Voy a intentar explicar el procedimiento que hace Microsoft SQL Server para evaluar esa consulta SQL, primero que todo tenemos que tener claro que al usar TP.EMPRESA en la subconsulta tenemos que agregarla a la cláusula GROUP BY o genera un error.

Código:
...
FROM TablaPrivote TP
GROUP BY TP.DOCUMENTOID, TP.EMPRESA
Para probar el error podríamos utilizar los siguiente datos de prueba,

Código:
DOCUMENTOID, EMPRESA, DEPARTAMENTO, CANTIDAD
          1, "EQUIS",             1,     100
          1, "SIUQE",             1,     100
Ahora, separamos la lógica principal de la consulta 'externa' de la subconsulta (interna), la consulta 'externa' extrae el primer registro de los datos para calcular el resultado,

Código:
SELECT
...
FROM TablaPrivote TP
Esa consulta extrae el primer registro para calcular los valores y filtrar en la consulta interna, despues lo haría con el segundo registro y así sucesivamente, revisemos con el primer registro:

Código:
DOCUMENTOID, EMPRESA, DEPARTAMENTO, CANTIDAD
          1, "EQUIS",             1,     100
Después ejecuta la subconsulta con los valores extraídos previamente, pero tenemos que tener claro que los valores de la consulta 'externa' se van a reemplazar en la consulta interna cuando tenga el prefijo TP.

Recordemos que todo lo que tiene prefijo con TP viene de la consulta 'externa', reemplazando los valores:

Código:
SELECT CANTIDADES FROM TablaPrivote
WHERE DEPARTAMENTO = 1 AND 'EQUIS' = 'EQUIS'
AND DOCUMENTOID = 1 
Ahora, ¿Cuantos registros coinciden en esa subconsulta?
Esta condición 'EQUIS' = 'EQUIS' se evalúa como 'true' para todos los registros. Todos. Y el subquery devuelve el error 'more than 1 value'.

Ahora, si cambiamos la consulta sin el prefijo TP entonces se evalúa de una forma completamente diferente,

Código:
SELECT CANTIDADES FROM TablaPrivote
WHERE DEPARTAMENTO = 1 AND EMPRESA = 'EQUIS'
AND DOCUMENTOID = 1 
¿Cuantos registros coinciden? Solo el documento 1
Y por lo tanto funciona.

Eso es lo más claro que puedo explicarlo, y puede que me haya equivocado en algunas cosas, pero básicamente ese es el concepto, sino posiblemente alguien mas pueda aclarar la situación,

Saludos,