Query "La subconsulta ha devuelto mas de un valor"


#1

Hola Muchachos,

Resulta que estoy generando un informe por el Query manager, la idea es que me sque el listado de los empleados de la alcaldía desde la tabla odln y ademas hay una tabla [dbo].[@PET_EMPLE_MUNICIPIO] de la cual voy a mostrar el tipo de vinculacion que tiene dicho empleado.
Cuando ejecuto el Query me saca un error en la subconsulta que dice que"ha devuelto mas de un valor, lo que no es correcto", si lo ejecuto sin la subconsulta si me funciona.

Este es el código.

SELECT  t0.docdate,u_idcliente,t0.cardname 'Nombre Empleado',
(select U_vinculacion from [dbo].[@PET_EMPLE_MUNICIPIO] where u_cedula=u_idcliente) 'Vinculacion',t0.u_secretaria 'Secretaria',t0.u_telcliente,t1.quantity,
   (case t1.itemcode when '13' then 'Explora' else 'Planetario' end) 'Boletas'
   FROM Odln T0 inner join dln1 t1 on (t0.docentry=t1.docentry)
   where t1.itemcode in ('13','32')
and t1.U_LISTA_PRECIOS in ('22') and t0.docdate between '01/06/2018' and '30/06/2018'

Esta es la consulta que se muestra sin la subconsulta

No se si me hice explicar bien, de antemano gracias


#2

Hola que tal!

Para poder utilizar una subconsulta, es necesario que esta sub consulta te envíe un solo valor y como tu sub consulta esta mandando más de una fila no la puedes utilizar.

Sería mejor que ejecutaras primero tu consulta y veas porque te manda más de una fila, quiza estas usando la llave equivocada o quizá tengas más de una cédula por cada cliente.
:stuck_out_tongue: Saludos!


#4

Hola @YazminSB,

Efectivamente en la consulta por cada cliente me arroja mas de una cédula, pero entonces el tema es que ese campo es el que tengo para poder comparar en el where de la subconsulta, no sabría como mas llevarle los datos de la vinculación a la consulta como tal.


#5

Hola Villa
Debes utilizar una funcion top, max, min U_vinculacion en la subconsulta o modificar el query de la siguiente manera.


SELECT  T0.DocDate, U_idcliente, T0.CardName 'Nombre Empleado', T1.Quantity,
T9.U_vinculacion 'Vinculacion', T0.U_secretaria 'Secretaria',T0.U_telcliente, 
CASE T1.ItemCode WHEN '13' THEN 'Explora' ELSE 'Planetario' END 'Boletas'
 FROM ODLN T0 
 INNER JOIN DLN1 T1 ON T0.DocEntry=T1.DocEntry
 LEFT JOIN 
 (SELECT U_cedula, U_vinculacion FROM [@PET_EMPLE_MUNICIPIO] ) T9 
                 ON  T9.U_cedula = U_idcliente  
 WHERE T1.ItemCode IN ('13','32') AND T1.U_LISTA_PRECIOS IN ('22') 
AND T0.DocDate BETWEEN '01/06/2018' AND '30/06/2018'

Saludos,
Andres Ramirez Jaramillo :colombia:


#6

@andresramirez

Muchas gracias,

Funcionó tal cual de las dos formas lo probé y ando de joya, con el top me saca el listado y con tu consulta igual.
Lo único es que con el left join me saca dos lineas adicionales que en la del top no me muestra, osea con top me muestra 100 registros y con el left join me muestra 102 registros.

Muchas gracias a todos por la ayuda.


#7

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.