Principales respuestas
Select de subselect que devuelve varios valores

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?
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
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
-
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. -
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;
GOEstas 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
-
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. -
-
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
-
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.