SQL - Consulta por Cursores en T-SQL

 
Vista:
sin imagen de perfil

Consulta por Cursores en T-SQL

Publicado por Silvina (6 intervenciones) el 11/12/2016 23:45:32
Buenas tardes,

Estoy practicando crear cursores en T-SQL y el sql server me devuelve el siguiente mensaje de error:
"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."

Necesito saber qué es lo que estoy haciendo mal.

El Script que ejecuté es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
USE [PARCIAL ]
GO
 
-- Declaración Variables a utilizar
DECLARE @Cant INT
SET @Cant = 0
DECLARE @Pregunta INT
SET @Pregunta = (SELECT TOP 1 pregunta FROM PARCIAL.Logs)
DECLARE @PregAnterior INT
SET @PregAnterior = @Pregunta
DECLARE @EsCorrecta CHAR (1)
SET @EsCorrecta = (SELECT esCorrecta FROM PARCIAL.Respuestas WHERE pregunta = @Pregunta)
DECLARE @CondAnterior CHAR (1)
SET @CondAnterior = @Cant
DECLARE @Maximo INT
SET @Maximo = 0
 
-- Declaración del cursor
DECLARE Cursor_Cantidades CURSOR GLOBAL
SCROLL
 
FOR SELECT P.idPregunta
FROM PARCIAL.Preguntas AS P INNER JOIN PARCIAL.Logs AS L
ON L.pregunta = P.idPregunta INNER JOIN PARCIAL.Respuestas AS R
ON R.idRespuesta= L.respuesta
ORDER BY L.fechaHora
 
-- Apertura del cursor
OPEN Cursor_Cantidades
 
-- Lectura de la primera fila del cursor
FETCH Cursor_Cantidades INTO @Cant
	WHILE ((@@FETCH_STATUS = 0) AND (@CondAnterior=@EsCorrecta))
	BEGIN
	IF (@PregAnterior=@Pregunta)
		SET @Cant = @Cant + 1
-- Lectura de la siguiente fila de un cursor
	FETCH Cursor_Cantidades INTO @Cant
	SET @Pregunta = (SELECT pregunta FROM PARCIAL.Logs)
-- Fin del bucle WHILE
	END
 
IF (@Maximo <= @Cant)
	SET @Maximo = @Cant
 
-- Cierra el cursor
CLOSE Cursor_Cantidades
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta por Cursores en T-SQL

Publicado por Isaias (1921 intervenciones) el 12/12/2016 17:44:18
Los CURSORES afectan mucho el servidor (sobre todo en al memoria), lo mismo puedes hacer con una tabla temporal o bien, una variable tipo tabla.

¿Porque te manda el error?

Bueno, eso sucede cuando estas haciendo SET a una variable y el resultado que te regresa son demasiados. ejemplo:

1
SET @MyVariable = (SELECT Clave FROM TABLA WHERE.......)

En este ejemplo, el SELECT regresa mas de un valor.

Ahora bien, no hagas el SET de tus variables de la forma que lo estas haciendo, es mejor

1
SELECT @EsCorrecta = esCorrecta FROM PARCIAL.Respuestas WHERE pregunta = @Pregunta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta por Cursores en T-SQL

Publicado por Silvina (6 intervenciones) el 12/12/2016 17:56:06
Muchas gracias por la respuesta, creo que el problema lo tengo cuando hago: SET @Pregunta = (SELECT pregunta FROM PARCIAL.Logs) en la línea 39.
Mi intención ahí es setear en la variable Pregunta el id de la pregunta del registro que está leyendo el cursor. Cómo sería la consulta para obtener ese id?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta por Cursores en T-SQL

Publicado por Isaias (1921 intervenciones) el 12/12/2016 18:36:44
Seguramente si ejecutas solamente tu consulta, te daras cuenta que te regresa mas de un registro

1
SELECT pregunta FROM PARCIAL.Logs

Insisto, yo no utilizaria cursores, en si, ¿que hace tu codigo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta por Cursores en T-SQL

Publicado por Silvina (6 intervenciones) el 12/12/2016 18:44:10
Yo tengo tres tablas, una de Preguntas, una de Respuestas, y una con el Historial (tabla Logs) de todas las respuestas que se dieron a las preguntas por cada jugador y en un horario.

Lo que quiero saber es cuál es el máximo de preguntas respondidas, de manera correcta, consecutivamente. Es decir, la cantidad de registros consecutivos de la tabla Logs de la misma pregunta y donde la respuesta seas correcta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta por Cursores en T-SQL

Publicado por Isaias (1921 intervenciones) el 12/12/2016 19:11:08
¿Como sabes que una pregunta fue contestada CORRECTAMENTE?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta por Cursores en T-SQL

Publicado por Silvina (6 intervenciones) el 12/12/2016 19:15:49
En la tabla Respuesta , que está relacionada con la tabla Logs y la tabla Pregunta, existe un campo "esCorrecta" que toma los valores 'S' si la respuesta es correcta o 'N' si la respuesta es incorrecta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta por Cursores en T-SQL

Publicado por Isaias (1921 intervenciones) el 12/12/2016 20:01:13
Nos regalas una muestra de tus datos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Consulta por Cursores en T-SQL

Publicado por Silvina (6 intervenciones) el 12/12/2016 23:15:56
Subo una imagen con el modelo de datos que estoy usando
DER
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta por Cursores en T-SQL

Publicado por Isaias (1921 intervenciones) el 12/12/2016 23:41:37
Empecemos con este query y de ahi vamos platicando

1
2
3
4
5
SELECT LOGS.*
LOGS INNER JOIN RESPUSTAS
ON LOGS.pregunta = RESPUESTAS.pregunta
WHERE RESPUESTAS.esCorrecta = 'S'
ORDER BY LOGS.idlog
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta por Cursores en T-SQL

Publicado por Silvina (6 intervenciones) el 13/12/2016 21:18:12
Ya lo pude solucionar creo.
Dejo el código del nuevo script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
USE [PARCIAL ]
GO
 
-- Declaración Variables a utilizar
DECLARE @Cant INT
SET @Cant = 0
DECLARE @Pregunta INT
DECLARE @PregAnterior INT
SET @PregAnterior = (SELECT TOP 1 pregunta FROM PARCIAL.Logs)
DECLARE @EsCorrecta CHAR (1)
SET @EsCorrecta = (SELECT TOP 1 esCorrecta FROM PARCIAL.Respuestas R INNER JOIN PARCIAL.Logs L
					ON L.respuesta=R.idRespuesta WHERE R.pregunta = 2)
DECLARE @CondAnterior CHAR (1)
SET @CondAnterior = @Cant
DECLARE @Maximo INT
SET @Maximo = 0
 
-- Declaración del cursor
DECLARE Cursor_Cantidades CURSOR GLOBAL
SCROLL
 
FOR SELECT L.pregunta
FROM PARCIAL.Logs AS L INNER JOIN PARCIAL.Respuestas AS R
ON R.idRespuesta= L.respuesta
WHERE R.esCorrecta = @EsCorrecta
ORDER BY L.fechaHora
 
-- Apertura del cursor
OPEN Cursor_Cantidades
 
-- Lectura de la primera fila del cursor
FETCH Cursor_Cantidades INTO @Pregunta
	WHILE ((@@FETCH_STATUS = 0) AND (@CondAnterior=@EsCorrecta))
	BEGIN
	IF (@PregAnterior=@Pregunta)
		SET @Cant = @Cant + 1
-- Lectura de la siguiente fila de un cursor
	FETCH Cursor_Cantidades INTO @Pregunta
 
-- Fin del bucle WHILE
	END
 
IF (@Maximo <= @Cant)
	SET @Maximo = @Cant
 
-- Cierra el cursor
CLOSE Cursor_Cantidades
 
PRINT @Maximo
 
-- Liberar el cursor
Deallocate Cursor_Cantidades
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta por Cursores en T-SQL

Publicado por Isaias (1921 intervenciones) el 13/12/2016 23:28:41
Hay muchas formas de matar cucarachas, algunos las aplastan con los pies, otros, les ponen mata-insectos, algunos utilizaran una bomba atomica, al cliente, lo que pida
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar