none
Select de subselect que devuelve varios valores RRS feed

  • Pregunta

  • Buenos dias.

    Las siguiente consulta me da el 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."

    SELECT Cantidad, Bodega FROM Manifiesto WHERE Reftransbordos = (SELECT Idtransbordo FROM Transbordos WHERE Refescala = (SELECT Idescala FROM Escalas WHERE Numero_escala LIKE '024/2009'))

    Entiendo que el SELECT anidado devuelve mas de un valor.

    ¿Como podria obtener todos los valores de Cantidad y Bodega para todas las Reftransbordos del select anidado?


    viernes, 23 de septiembre de 2016 11:55

Respuestas

  • Hay un pequeño error. No puedes usar el signo "=" y debes sustituirlo por IN :

    SELECT Cantidad, Bodega FROM Manifiesto WHERE Reftransbordos IN (SELECT Idtransbordo FROM Transbordos WHERE Refescala IN (SELECT Idescala FROM Escalas WHERE Numero_escala LIKE '024/2009'))


    Saludos, Javier J

    • Propuesto como respuesta HunchbackMVP viernes, 23 de septiembre de 2016 13:49
    • Marcado como respuesta Franpereira viernes, 23 de septiembre de 2016 14:01
    viernes, 23 de septiembre de 2016 12:07

Todas las respuestas

  • Hay un pequeño error. No puedes usar el signo "=" y debes sustituirlo por IN :

    SELECT Cantidad, Bodega FROM Manifiesto WHERE Reftransbordos IN (SELECT Idtransbordo FROM Transbordos WHERE Refescala IN (SELECT Idescala FROM Escalas WHERE Numero_escala LIKE '024/2009'))


    Saludos, Javier J

    • Propuesto como respuesta HunchbackMVP viernes, 23 de septiembre de 2016 13:49
    • Marcado como respuesta Franpereira viernes, 23 de septiembre de 2016 14:01
    viernes, 23 de septiembre de 2016 12:07
  • Franpereira,

    El error resulta porque la subconsulta podría retornar un conjunto de resultados y la expresión -de la cláusula WHERE- espera por un valor escalar. Aún cuando el problema podría solucionarse con el operador IN, podrías evitar las subconsultas combinando las filas:

    SELECT 
        m.Cantidad, m.Bodega 
    FROM 
        Manifiesto m
        INNER JOIN Transbordos t ON (m.Reftransbordos = t.Idtransbordo)
        INNER JOIN Escalas e ON (t.Refescala = e.Idescala)
    	   AND Numero_escala = '024/2009';


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 23 de septiembre de 2016 13:36
  • Willams,

    Eso depende de la cardinalidad de la subconsulta y semantica de la pregunta o query. Cuando usamos IN o EXISTS casi siempre se desea comprobar existencia, lo cual cambiaria el resultado si la subconsulta devuelve valores repetidos y usamos INNER.

    Ejemplo:

    declare @T1 table (col1 int not null primary key);
    declare @T2 table (col1 int not null);

    insert into @T1(col1) values (1), (2);
    insert into @T2(col1) values (1), (2),(2),(2),(3);

    select * from @T1 where col1 in (select T2.col1 from @T2 as T2);

    select * from @T1 as T1 inner join @T2 as T2 on T1.col1 = T2.col1;
    GO

    Estas dos queries son diferentes semanticamente.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas





    • Editado HunchbackMVP viernes, 23 de septiembre de 2016 14:40
    viernes, 23 de septiembre de 2016 13:57
  • Hay un pequeño error. No puedes usar el signo "=" y debes sustituirlo por IN :

    SELECT Cantidad, Bodega FROM Manifiesto WHERE Reftransbordos IN (SELECT Idtransbordo FROM Transbordos WHERE Refescala IN (SELECT Idescala FROM Escalas WHERE Numero_escala LIKE '024/2009'))


    Saludos, Javier J


    Muchas gracias. Solucionado.
    viernes, 23 de septiembre de 2016 14:01
  • Gracias por responder.

    Creo que en mi caso valdrían las dos opciones ¿Con cual obtendría mejor rendimiento?

    viernes, 23 de septiembre de 2016 14:04
  • Eso dependera del numero de filas en cada tabla y/o existencia de restricciones e indices apropiados para dar soporte a la query.

    Yo en lo personal, si el query se puede expresar mediante union pues asi lo haria.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP viernes, 23 de septiembre de 2016 15:38
    viernes, 23 de septiembre de 2016 14:50
  • Gracias por responder.

    Creo que en mi caso valdrían las dos opciones ¿Con cual obtendría mejor rendimiento?

    Si los datos no son inconveniente y me das a elegir entre combinar filas y realizar subconsultas sin duda elijo la primera opción, aún cuando existiesen todas las condiciones para que no haya diferencia mayor en el rendimiento, la legibilidad de código de la primera opción sigue siendo -en lo personal- una ventaja mas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 23 de septiembre de 2016 15:28