none
Ayuda, no logro realizar correctamente mi consulta. RRS feed

  • Pregunta

  • SELECT [dbo].[Gasolina].[Concepto],
    [dbo].[Gasolina].[Magna],
    [dbo].[Gasolina].[Premium],
    [dbo].[Gasolina].[Diesel],

    (SELECT [dbo].[Importes].[Concepto] FROM [dbo].[Importes] WHERE [dbo].[Importes].[IdCarga] = [dbo].[Gasolina].[IdCarga])
    [Concepto],
    (SELECT [dbo].[Importes].[Monto] FROM [dbo].[Importes] WHERE [dbo].[Importes].[IdCarga] = [dbo].[Gasolina].[IdCarga])
    [Monto],

    (SELECT [dbo].[Cargas].[NombreArch] FROM [dbo].[Cargas] WHERE [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga])
    [NombreArch],
    (SELECT [dbo].[Cargas].[Comentario] FROM [dbo].[Cargas] WHERE [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga])
    [Comentario],
    (SELECT [dbo].[Cargas].[FechaArch] FROM [dbo].[Cargas] WHERE [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga])
    [FechaArch]

    FROM [dbo].[Gasolina]

    El mensaje que me arroja "Mens. 512, Nivel 16, Estado 1, Línea 10 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."

    viernes, 16 de noviembre de 2018 20:11

Respuestas

  • Hola RicardoGongora:

    Lo que te indica FARL31, es que ejecutes cada una de las subconsultas, unicamente, para saber si devuelve un resultado úncio, cosa que no  hacen porque te lo índica el error.

    Según tu consulta dice.

    Dame CONCEPTO, MAGNA, PREMIUN, DIESEL, (todos los conceptos que sean = idCarga), (todos los montos.... y sucesivamente, y el motor te dice que una de las subconsultas, para un idCarga tiene varios valores. Por ejemplo Select Monto from dbo.Importes where idCarga = Gasolina.idCarga. Y resulta que esta subconsulta, en cargas tiene 3 filas para ese id. Entonces el motor no sabe escoger cual de las filas.

    Normalmente cuando se utiliza esto, se usan funciones de agrupación.

    Ejemplo para la subconsulta

    Select sum(monto) from dbo.Importes d 
    where d.idCarga = dbo.Gasolina.IdCarga

    Además te indico, que es un poco raro no querer usar joins, porque es mucho más eficaz, y el propio motor es más que posible, que en su plan de ejecución evalue tu consulta y la convierta en un inner join.

    Por otro lado si utilizas la sintaxis ANSI 92 para el código, será más fácil de leer y de programar, ubicarás mejor los errores.

    Te traslado tu consulta como puede ser:

    Para evitar tu error he utilizado funciones de agregacion min y sum para todas las subconsultas, aun cuando no debiera de ser.

    SELECT Concepto,Magna,Premium.Diesel,
    		(SELECT min(Concepto) FROM [dbo].[Importes] d WHERE d.IdCarga = g.IdCarga) as [Concepto],
    		(SELECT sum(Monto) FROM [dbo].[Importes] e WHERE e.IdCarga = g.IdCarga) as [Monto],
    		(SELECT min(NombreArch) FROM [dbo].[Cargas] f WHERE f.IdCarga = g.IdCarga) as [NombreArch],
    		(SELECT min(Comentario) FROM [dbo].[Cargas] h WHERE h.IdCarga = g.IdCarga) as [Comentario],
    		(SELECT min(FechaArch) FROM [dbo].[Cargas] i WHERE i.IdCarga = g.IdCarga) as [FechaArch]
    FROM [dbo].[Gasolina] g
    Si observas la sintaxis es mucho más breve, concisa y facil de leer.

    Si bien los alias de tabla de las subconsultas correlativas, no tiene porque ser diferentes, creo que es más visual.

    Espero te ayude.

    sábado, 17 de noviembre de 2018 8:19

Todas las respuestas

  • Mira asi:
    SELECT [dbo].[Gasolina].[Concepto],
    [dbo].[Gasolina].[Magna],
    [dbo].[Gasolina].[Premium],
    [dbo].[Gasolina].[Diesel],.
    Importes_C.[Concepto],
    Importes_M.[Monto],
    Cargas_M.[NombreArch],
    Cargas_C.[Comentario],
    Cargas_F.[FechaArch]


    FROM [dbo].[Gasolina],(SELECT [dbo].[Importes].[Concepto] FROM [dbo].[Importes] WHERE [dbo].[Importes].[IdCarga] = [dbo].[Gasolina].[IdCarga])AS Importes_C,
    (SELECT [dbo].[Importes].[Monto] FROM [dbo].[Importes] WHERE [dbo].[Importes].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Importes_M,
    (SELECT [dbo].[Cargas].[NombreArch] FROM [dbo].[Cargas] WHERE [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Cargas_M,
    (SELECT [dbo].[Cargas].[Comentario] FROM [dbo].[Cargas] WHERE [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Cargas_C,
    (SELECT [dbo].[Cargas].[FechaArch] FROM [dbo].[Cargas] WHERE [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Cargas_F


    Pero me parece que es mejor asi:

    SELECT [dbo].[Gasolina].[Concepto],
    [dbo].[Gasolina].[Magna],
    [dbo].[Gasolina].[Premium],
    [dbo].[Gasolina].[Diesel],.
    Importes_C.[Concepto],
    Importes_M.[Monto],
    Cargas_M.[NombreArch],
    Cargas_C.[Comentario],
    Cargas_F.[FechaArch]


    FROM [dbo].[Gasolina],(SELECT [dbo].[Importes].[Concepto] FROM [dbo].[Importes] INNER JOIN [dbo].[Gasolina] ON [dbo].[Importes].[IdCarga] = [dbo].[Gasolina].[IdCarga])AS Importes_C,
    (SELECT [dbo].[Importes].[Monto] FROM [dbo].[Importes] INNER JOIN [dbo].[Gasolina] ON [dbo].[Importes].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Importes_M,
    (SELECT [dbo].[Cargas].[NombreArch] FROM [dbo].[Cargas]  INNER JOIN [dbo].[Gasolina] ON [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Cargas_M,
    (SELECT [dbo].[Cargas].[Comentario] FROM [dbo].[Cargas]  INNER JOIN [dbo].[Gasolina] ON [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Cargas_C,
    (SELECT [dbo].[Cargas].[FechaArch] FROM [dbo].[Cargas]  INNER JOIN [dbo].[Gasolina] ON [dbo].[Cargas].[IdCarga] = [dbo].[Gasolina].[IdCarga]) AS Cargas_F

    Espero que te funcione

    viernes, 16 de noviembre de 2018 21:23
  • Lo que tienes tambien podria funcionar, pero valida que no tengas datos repetidos en las subconsultas.

    viernes, 16 de noviembre de 2018 21:30
  • Gracias por el tiempo, me parece bien.

    El detalle es que No deseo usar JOIN, y realizar la consulta con sub consultas nada más.

    viernes, 16 de noviembre de 2018 21:35
  • Ya validastes que no arroje mas de un resultado en las subconsultas.

    El error que te sale es porque en las subconsultas , te arroja mas de un resultado

    viernes, 16 de noviembre de 2018 21:37
  • Me podría ayudar con la validación ?, para saber como sería .

    viernes, 16 de noviembre de 2018 21:50
  • Hola RicardoGongora:

    Lo que te indica FARL31, es que ejecutes cada una de las subconsultas, unicamente, para saber si devuelve un resultado úncio, cosa que no  hacen porque te lo índica el error.

    Según tu consulta dice.

    Dame CONCEPTO, MAGNA, PREMIUN, DIESEL, (todos los conceptos que sean = idCarga), (todos los montos.... y sucesivamente, y el motor te dice que una de las subconsultas, para un idCarga tiene varios valores. Por ejemplo Select Monto from dbo.Importes where idCarga = Gasolina.idCarga. Y resulta que esta subconsulta, en cargas tiene 3 filas para ese id. Entonces el motor no sabe escoger cual de las filas.

    Normalmente cuando se utiliza esto, se usan funciones de agrupación.

    Ejemplo para la subconsulta

    Select sum(monto) from dbo.Importes d 
    where d.idCarga = dbo.Gasolina.IdCarga

    Además te indico, que es un poco raro no querer usar joins, porque es mucho más eficaz, y el propio motor es más que posible, que en su plan de ejecución evalue tu consulta y la convierta en un inner join.

    Por otro lado si utilizas la sintaxis ANSI 92 para el código, será más fácil de leer y de programar, ubicarás mejor los errores.

    Te traslado tu consulta como puede ser:

    Para evitar tu error he utilizado funciones de agregacion min y sum para todas las subconsultas, aun cuando no debiera de ser.

    SELECT Concepto,Magna,Premium.Diesel,
    		(SELECT min(Concepto) FROM [dbo].[Importes] d WHERE d.IdCarga = g.IdCarga) as [Concepto],
    		(SELECT sum(Monto) FROM [dbo].[Importes] e WHERE e.IdCarga = g.IdCarga) as [Monto],
    		(SELECT min(NombreArch) FROM [dbo].[Cargas] f WHERE f.IdCarga = g.IdCarga) as [NombreArch],
    		(SELECT min(Comentario) FROM [dbo].[Cargas] h WHERE h.IdCarga = g.IdCarga) as [Comentario],
    		(SELECT min(FechaArch) FROM [dbo].[Cargas] i WHERE i.IdCarga = g.IdCarga) as [FechaArch]
    FROM [dbo].[Gasolina] g
    Si observas la sintaxis es mucho más breve, concisa y facil de leer.

    Si bien los alias de tabla de las subconsultas correlativas, no tiene porque ser diferentes, creo que es más visual.

    Espero te ayude.

    sábado, 17 de noviembre de 2018 8:19