Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Duda!! Con algo que me parece extraño! Me ayudan?

Estas en el tema de Duda!! Con algo que me parece extraño! Me ayudan? en el foro de SQL Server en Foros del Web. Hola espero que se encuentren excelente!! Tengo una duda con respecto a algo que me sucede con una sentencia... el punto es que tengo una ...
  #1 (permalink)  
Antiguo 28/08/2010, 23:51
 
Fecha de Ingreso: julio-2010
Mensajes: 31
Antigüedad: 14 años, 4 meses
Puntos: 0
Duda!! Con algo que me parece extraño! Me ayudan?

Hola espero que se encuentren excelente!! Tengo una duda con respecto a algo que me sucede con una sentencia... el punto es que tengo una tabla la cuál giro de coordenada por decirlo asi.. como les llaman tabla pivote mediante la sig.
sentencia..


SELECT ISNULL(TP.DOCUMENTOID, ''),
DEPA1 = ISNULL((SELECT CANTIDADES FROM TablaPrivote WHERE DEPARTAMENTO = 1 AND TP.EMPRESA = 'EQUIS' AND DOCUMENTOID = TP.DOCUMENTOID),0),
DEPA2 = ISNULL((SELECT CANTIDADES FROM TablaPrivote WHERE DEPARTAMENTO = 2 AND TP.EMPRESA = 'EQUIS' AND DOCUMENTOID = TP.DOCUMENTOID),0),

FROM TablaPrivote TP
GROUP BY TP.DOCUMENTOID

SI HAGO ESTO ME MARCA EL SIGUIENTE ERROR:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

ENTIENDO PERFECTO EL ERROR!!!.. QUE ME TRAE EN EL "=" DOS VALORES Y ESO ES INVALIDO .. PERFECTO LO ENTIENDO .. LO QUE NO ENTIENDO.. ES LO SIG.

SI LE CAMBIO A MI QUERY EL TP.EMPRESA = 'EQUIS' QUITANDOLE EL ALIAS DEJANDOLO ASI EMPRESA = 'EQUIS'.. YA NO ME MARCA EL ERROR
ME PODRIAN DECIR PORQUE???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?


GRACIAS!
  #2 (permalink)  
Antiguo 29/08/2010, 00:31
 
Fecha de Ingreso: julio-2010
Mensajes: 31
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Duda!! Con algo que me parece extraño! Me ayudan?

Cita:
Iniciado por in_rainbows Ver Mensaje
Hola espero que se encuentren excelente!! Tengo una duda con respecto a algo que me sucede con una sentencia... el punto es que tengo una tabla la cuál giro de coordenada por decirlo asi.. como les llaman tabla pivote mediante la sig.
sentencia..


SELECT ISNULL(TP.DOCUMENTOID, ''),
DEPA1 = ISNULL((SELECT CANTIDADES FROM TablaPrivote WHERE DEPARTAMENTO = 1 AND TP.EMPRESA = 'EQUIS' AND DOCUMENTOID = TP.DOCUMENTOID),0),
DEPA2 = ISNULL((SELECT CANTIDADES FROM TablaPrivote WHERE DEPARTAMENTO = 2 AND TP.EMPRESA = 'EQUIS' AND DOCUMENTOID = TP.DOCUMENTOID),0)

FROM TablaPrivote TP
GROUP BY TP.DOCUMENTOID

SI HAGO ESTO ME MARCA EL SIGUIENTE ERROR:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

ENTIENDO PERFECTO EL ERROR!!!.. QUE ME TRAE EN EL "=" DOS VALORES Y ESO ES INVALIDO .. PERFECTO LO ENTIENDO .. LO QUE NO ENTIENDO.. ES LO SIG.

SI LE CAMBIO A MI QUERY EL TP.EMPRESA = 'EQUIS' QUITANDOLE EL ALIAS DEJANDOLO ASI EMPRESA = 'EQUIS'.. YA NO ME MARCA EL ERROR
ME PODRIAN DECIR PORQUE???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?


GRACIAS!
  #3 (permalink)  
Antiguo 29/08/2010, 02:17
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 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,

Etiquetas: extraño
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:40.