Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Select que devuelve varios camos

Estas en el tema de Select que devuelve varios camos en el foro de Bases de Datos General en Foros del Web. Buenas, Tengo un problemilla con una consulta(funcion definida por un usuario), y es que no se como anidar un select que devuelve mas de un ...
  #1 (permalink)  
Antiguo 01/09/2005, 08:39
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
Select que devuelve varios camos

Buenas,

Tengo un problemilla con una consulta(funcion definida por un usuario), y es que no se como anidar un select que devuelve mas de un valor,

Los selects son:
Select count(IdVav) from Valvulas where IdNodo=(select Idnodo from Nodos where IdEC=(Select IdEC from EC where IdP=@ic))

Y claro si solo devuelve un valor el ultimo select funciona pero si por ejemplo:

Select IdEC from EC where IdP=@ic, devuelve los valores 39,45, entonces al hacer:
select Idnodo from Nodos where IdEC=39,45 me da error(ya que son dos valores), alguien sabe como se soluciona?¿

GRACIAS
  #2 (permalink)  
Antiguo 01/09/2005, 08:48
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
No entiendo bien lo que quieres obtener pero si quieres que una consulta tome encuenta varios valores...como por ejemplo el primer select.. que cuente los ids obtenidos por la sub consulta deberia ser...

Select count(IdNodo) from Valvulas where IdNodo in ( <consulta que devuelve una lista de Idnodo>)



  #3 (permalink)  
Antiguo 01/09/2005, 11:50
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
Buenas Andres95,

Te comento son tres tablas diferente y cada una va enlazada, y yo quiero saber el numero de valvulas que tiene una Parcela, para eso necesito saber la EC y luego el nodo, ya que esto va asi:
Parcelas-EC-Nodos-Valvulas, pues bien:

con esta:(Select IdEC from EC where IdP=@ic(es una variable que le paso), pretendo que me diga las EC's que tiene una parcela.
con esta: select Idnodo from Nodos where IdEC=Select..., con esta pretendo que me diga los ndos de una EC, de esta forma ya se las EC's que tiene una parcela y los nodos que estan asignado a estas EC's

Y por último cuento las valvulas que tienen los nodos asignados a las EC's que a su vez estan asigandos a la Parcela
Select count(IdVav) from Valvulas where IdNodo

Ahora bien la consulta q tengo por ejemplo de la subconsulta (Select IdEC from EC where IdP=@ic si me devuelve solo un valor no hay problema, ya que la siguiente subconsulta: select Idnodo from Nodos where IdEC será igualar este EC a un solo valor, el problema bien cuando la subconsulta anterior((Select IdEC from EC where IdP=@ic) me devuelve por ejemplo el valor 39 y52 entonces claro la siguiente subconsulta que seria:
'select Idnodo from Nodos where IdEC', le estoy diciendo que el id es 39 y 52 (aqui el problema) no se como decirle que el ID tiene que ser igual a esos dos resultados

Espero haberme explicado mejor y gracias
  #4 (permalink)  
Antiguo 01/09/2005, 12:25
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Bueno, para hacer lo que mencionas.. se debe utilizar IN en lugar de el signo de igual( = ), y de esta forma el select busca valores dentro de un rango.

por ejemplo

Select nombre_cliente from clientes where id_cliente IN (32,56,98,25)

trae los nombres de clientes que tienen las ids listadas....


Sin embargo, creo que tu consulta se puede simplificar de esta forma...
leyendo de las tres tablas y agregando las condiciones que deseas.

Espero te sea util.


SELECT
count(v.iDvav)
FROM
valvulas V, nodos N,EC E
WHERE
v.idNodo = N.idnodo AND
N.IdEc = E.IdEC AND
Idp = @ic
  #5 (permalink)  
Antiguo 01/09/2005, 12:53
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
Pues muchas gracias andres, mñn lo pruebo y te digo algo, pero para ser correcto no te faltaria poner parcelas?¿, es decir que quedase asi:

SELECT
count(v.iDvav)
FROM
valvulas V, nodos N,EC E,Parcelas P
WHERE
v.idNodo = N.idnodo AND
N.IdEc = E.IdEC AND
P.Idp = @ic
  #6 (permalink)  
Antiguo 01/09/2005, 13:15
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
SELECT
count(v.iDvav)
FROM
valvulas V, nodos N,EC E,Parcelas P
WHERE
v.idNodo = N.idnodo AND
N.IdEc = E.IdEC AND
P.Idp = @ic

Aqui se perderia el vinculo...

es decir, está relacionado valvulas con nodos (v.idNodo = N.idnodo) y luego nodos con EC (N.IdEc = E.IdEC) pero ya no hay vinculo de EC con parcelas...

En la anterior...me faltó un prefijo... debia ser E.Idp .... ya que cada EC tiene el id de la parcela a la que pertenece... como ese idp ya lo sabemos...( es el parametro @ic) ya no es necesario implicar a la tabla parcela...( ya conocemos el id a buscar)


Caso contrario sucederia por ejemplo si quisieramos seleccionar por rangos...es decir, de un id parcela minimo, hasta un id parcela maximo...ahi si.. agregariamos parametros como sigue...


SELECT
count(v.iDvav)
FROM
valvulas V, nodos N,EC E, parcelas P
WHERE
v.idNodo = N.idnodo AND
N.IdEc = E.IdEC AND
E.Idp = P.Idp AND
(P.Idp >= @id_minimo and P.Idp <= @id_maximo)



como ves?

Bueno espero te sea util la info...

  #7 (permalink)  
Antiguo 02/09/2005, 13:01
 
Fecha de Ingreso: diciembre-2003
Mensajes: 288
Antigüedad: 20 años, 4 meses
Puntos: 0
Tio eres un MAESTRO, he probado todas y todas van, y a la mia como tu bien has dicho solo le faltaba el IN en vez del =, ahora otra preguntilla(ya se que abuso ), tu sabes alguna solucion en vez de utilizar un After DELETE?¿, pq tengo un trigger dnd le pongo una cosa como:

@id=IdEC from deleted, y luego hago un update de un campo igualando un Id a este @id, y no me da error pero no me funciona

GRACIAS
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:28.