Usuario
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.

Pregunta
-
Agradezco la ayuda que me puedan brindar con este mensaje, cuando realizo una subconsulta en un Select, que esta de la siguiente manera:
SELECT
PREGUNTA =
(SELECT CRITEV FROM AD_CRITEV WHERE ID_C_EV = 1 UNION ALL SELECT B.PREGUNTA FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 1 UNION ALL SELECT CRITEV FROM AD_CRITEV
WHERE ID_C_EV = 2 UNION ALL SELECT B.PREGUNTA FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 2 UNION ALL SELECT CRITEV FROM AD_CRITEV WHERE ID_C_EV = 3
UNION ALL SELECT B.PREGUNTA FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 3 UNION ALL SELECT CRITEV FROM AD_CRITEV WHERE ID_C_EV = 4 UNION ALL SELECT B.PREGUNTA
FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 4)Todo lo que esta en la sub consulta, funciona de manera correcta, pero al encapsularlo, arroja el error.
Todas las respuestas
-
Simple, la SUB-CONSULTA te esta regreando MAS de un valor
IIslas Master Consultant SQL Server
- Propuesto como respuesta Diana AcuñaModerator viernes, 17 de enero de 2020 16:22
-
-
Pues nada, que si lanzas esas consultas con los mismos parametros te esta retornando mas de un valor, ademas que tienes varias UNION ALL y eso obviamente aumenta las posibiidades de ese tipo de errores, mira aqui este ejemplo que funciona sin problema
DECLARE @MiTabla AS TABLE ( Id INT); INSERT INTO @MiTabla (Id) VALUES (1),(2),(3); DECLARE @NumPregunta INT; SELECT @NumPregunta = (SELECT Id FROM @MiTabla WHERE Id = 1) SELECT @NumPregunta
Asi que nada, revisa o restructura tu consulta para forzar a que nunca te retornme mas de una fila.
"Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net
- Propuesto como respuesta Diana AcuñaModerator viernes, 17 de enero de 2020 16:22
-
-
Hola CamBass:
Para asegurarte que no te devuelva error, puedes hacer un
SELECT PREGUNTA = (SELECT TOP(1) D.CRITEV FROM ( (SELECT CRITEV FROM AD_CRITEV WHERE ID_C_EV = 1 UNION ALL SELECT B.PREGUNTA FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 1 UNION ALL SELECT CRITEV FROM AD_CRITEV WHERE ID_C_EV = 2 UNION ALL SELECT B.PREGUNTA FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 2 UNION ALL SELECT CRITEV FROM AD_CRITEV WHERE ID_C_EV = 3 UNION ALL SELECT B.PREGUNTA FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 3 UNION ALL SELECT CRITEV FROM AD_CRITEV WHERE ID_C_EV = 4 UNION ALL SELECT B.PREGUNTA FROM AD_CRITEV A INNER JOIN AD_LISTPREG B ON A.ID_C_EV = B.CRITEV AND B.FORMEV = 2 WHERE B.CRITEV = 4) ) AS D );
O lo que es lo mismo, tú sentencia sql la integras como una tabla derivada y del resultado, obtienes solo el primer valor.
No obstante, si el motor te dice que puede devolver más de un valor, es que puede. Por tanto hay que tenerlo en cuenta.