Foros del Web » Programación para mayores de 30 ;) » .NET »

2 sql

Estas en el tema de 2 sql en el foro de .NET en Foros del Web. Estoy intentando implementar una lista con unos registros y saco la lista de una sql. Me gustaria hacer otra sql para comparar los resultados, como ...

  #1 (permalink)  
Antiguo 04/05/2005, 02:48
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
2 sql

Estoy intentando implementar una lista con unos registros y saco la lista de una sql. Me gustaria hacer otra sql para comparar los resultados, como se pone para recorrer 2 recordset????
Seria algo asi:
while (reader4.Read() and reader5.Read())
{
}

gracias
  #2 (permalink)  
Antiguo 04/05/2005, 03:12
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
Vmamos a ver,depende de lo que te devulva o como te lo devuelvan veo dos formas pero esa no la termino de ver ya que ;
el while se matiene mientras devuleva true la condicion,si uno acaba ,el otro no lo recorrera entero
2 por que segun eso si kieres comparar tiene que estar en la misma posicion
si en vez d eun and podrias un or podrias tener problemas de si tienen diferente tamaño en numero de registros podria salirse de rango...

Si no tienes mas remedio que hacer 2 consultas,q lo suyo seria hacer una consulta q engolbara alas 2 para no andar haciendo comparaciones
yo haria con un for y dentor otro for o con un while y dentro otro while
Ya tedigo que dependera si las posiciones en las que estan los registros son las mismas (ordenadas por el mismo codigo) o un registro de una cosulta lleba varios de la otra....

Última edición por neivan; 04/05/2005 a las 03:18
  #3 (permalink)  
Antiguo 04/05/2005, 03:18
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
mi problem

Veras yo lo consigo hacer con 1 sola sql pero el problema es que me repite los registros con el mismo nombre. Y el distinct no me vale xq requiero el nombre de los usuariosy eso es lo que diferencia cada registro.
Me encantaria saber si hay alguna forma de que la sql me saque los registros iguales como si guera solo uno.

sino con 2 sq como lo harias asi:

while (reader4.read())
{
while (reader5.read())
{
}
}
  #4 (permalink)  
Antiguo 04/05/2005, 03:21
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
Seguro que habra alguna forma de hacer la consulta a mondandola a lo que kieres,un distinc no podras utilizar por si hay dos usuarios con un mismo nombre y son diferentes ... pero habra otra forma de coseguir que no se repitan.Esñame tu consulta.
Con esos while como los tienes ahora por cada regustro del while (reader4.read()) recorreria todos los registros de while (reader5.read()) dond epodras hacer tus comparaciones o lo que kieras hacer
  #5 (permalink)  
Antiguo 04/05/2005, 03:30
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
consulta

SELECT Servicios.ServNombre, TipoServicio.TipoNombre, UsuariosServicios.UsServIdUs FROM UsuariosServicios INNER JOIN Servicios ON UsuariosServicios.UsServIdServ = Servicios.ServId INNER JOIN TipoServicio ON Servicios.ServIdTipo = TipoServicio.TipoId INNER JOIN Usuarios ON UsuariosServicios.UsServIdUs = Usuarios.UsId INNER JOIN Clientes ON Usuarios.UsIdCli = Clientes.UsIdCli WHERE (Clientes.UsIdCli =2 ) ORDER BY Servicios.ServNombre

con esto saco:
-el nombre de los servicios
-el tipo de servicio que es
-el usuario que tiene el servicio

pero claro los nombres de los servicios me salen repetidos xq los tienes varios usuarios y me gustaria que solo me salieran una vez.
  #6 (permalink)  
Antiguo 04/05/2005, 03:32
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Buenas nombela, veo que sigues con este tema... Prueba esto en tu sql:


SELECT Servicios.ServNombre, TipoServicio.TipoNombre, Usuarios.UsId FROM (Clientes INNER JOIN Usuarios ON Clientes.UsIdCli = Usuarios.UsIdCli) INNER JOIN (TipoServicio INNER JOIN (Servicios INNER JOIN UsuariosServicios ON Servicios.ServId = UsuariosServicios.UsServIdServ) ON TipoServicio.TipoId = Servicios.ServIdTipo) ON Usuarios.UsId = UsuariosServicios.UsServIdUs WHERE (((Clientes.UsIdCli)=2)) group by Servicios.ServNombre, TipoServicio.TipoNombre;

(La consulta la he pillado de tu anterior post, de la que te devolvía:

ServNombr TipoNombre UsId
Lan/Wan Alcobendas Lan/Wan 3
Lan/Wan Valdemoro Lan/Wan 39
Lan/Wan Valdemoro Lan/Wan 3
Lan/Wan Pozuelo Lan/Wan 3
Seguridad Valdemoro Seguridad 39
Seguridad Pozuelo Seguridad 3
Wifi Pozuelo Wifi 3
  #7 (permalink)  
Antiguo 04/05/2005, 03:40
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
Nada

Pues si Jose sigo con lo mismo y ya con la moral muy baja...
la consulta que me has puesto tu me dice que no es valida xq la columna Usuarios.UsId no esta contenida en una funcion de agregado ni en la clausa goup by.
Y poniendola en el group by me sigo sacando repeticiones.
  #8 (permalink)  
Antiguo 04/05/2005, 03:59
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Joer, a mi mysql si que me deja hacer eso, y además me lo muestra como tu querías, voy a seguir dandole unas vueltillas a la consulta haber que se me ocurre
  #9 (permalink)  
Antiguo 04/05/2005, 04:07
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
el problema que yo veo

Es ke yo no se si se podran agrupar los resultados xq lo que muestra depende del usuario. y si los agrupa como puede saber que usuarios es el que tiene el servicio????

No se la verdad...
  #10 (permalink)  
Antiguo 04/05/2005, 04:16
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Pues prueba esto, para ver si diciendole que coja solo un UsId te deja (aunque no creo que vaya)


SELECT Servicios.ServNombre, TipoServicio.TipoNombre, max(Usuarios.UsId) FROM (Clientes INNER JOIN Usuarios ON Clientes.UsIdCli = Usuarios.UsIdCli) INNER JOIN (TipoServicio INNER JOIN (Servicios INNER JOIN UsuariosServicios ON Servicios.ServId = UsuariosServicios.UsServIdServ) ON TipoServicio.TipoId = Servicios.ServIdTipo) ON Usuarios.UsId = UsuariosServicios.UsServIdUs WHERE (((Clientes.UsIdCli)=2)) group by Servicios.ServNombre, TipoServicio.TipoNombre;
  #11 (permalink)  
Antiguo 04/05/2005, 04:18
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
Vamos a ver,yo no utilizo inner join on y me van perfectamente,he leido lo que hace y hace lo mismo que si no estubieran,vamos que tres cursos que he dao de bases de datos nunca lo habia utilizado.viendo tu consulta haber con esto;

SELECT S.ServNombre, T.TipoNombre, US.UsServIdUs FROM UsuariosServicios US , TipoServicio T ,Usuarios u,Clientes c,Servicios S WHERE USUsServIdServ = S.ServId and (C.UsIdCli =2 ) and S.ServIdTipo = T.TipoId and US.UsServIdUs = U.UsId and U.UsIdCli = C.UsIdCli ORDER BY S.ServNombre

Supongo que esto e s lo mismo que tienes tu puesto d eotra manera mas breve y mas facil de ver para mi al menos
lo unico que hay que comprobar aki es que en la whuere esten todas las tablas relacioneadas para que no aparezcan filas duplicadas.

Espero servirte de ayuda
  #12 (permalink)  
Antiguo 04/05/2005, 04:46
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
en fin

Bueno pues viendo que con una sql no me es posible que se me agrupen los registros. Me parece que tendre que usar 2 sql. no creis???'
  #13 (permalink)  
Antiguo 04/05/2005, 04:52
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
haber.me parece mu raro esto.
No s nada dificil hacer una consulta de varias tablas,aunque sean 5 y uqe no te salgan duplicadas las filas.
Voy a mirar tus post anteriores sobre este tema.Haber si veo bien lo qeu kieres recuperar para ver si he entendido bien y te pongo lo uqe podrias poner haber.
Mientras puedes hacer lo de las consultas.Por no estar parado sin o encuetnras la solucion.
  #14 (permalink)  
Antiguo 04/05/2005, 05:01
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
el problema

La cuestion que yo empiezo a ver insalvable es que yo tengo que sacar un listado de todos los servicio de una empresa vale.
Y luego dentro de esa lista tengo que poner una check en los servicios que estan activados segun el usuario que sea. Pues con la sql que tengo me saca todos los servicios pero claro como hay varios usuarios con el mismo servicio pues salen repetidos los servicios.
Ahora si coges y agrupas los repetidos, no puedes saber a que usuario pertenece cada servicio xq no se sabe que usuario es al que le afecta ese servicio.
Espero haberme explicado bien.
  #15 (permalink)  
Antiguo 04/05/2005, 05:21
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Y esto no te vale????

SELECT Servicios.ServNombre, TipoServicio.TipoNombre, Usuarios.UsId FROM (Clientes LEFT JOIN Usuarios ON Clientes.UsIdCli = Usuarios.UsIdCli) INNER JOIN (TipoServicio INNER JOIN (Servicios INNER JOIN UsuariosServicios ON Servicios.ServId = UsuariosServicios.UsServIdServ) ON TipoServicio.TipoId = Servicios.ServIdTipo) ON Usuarios.UsId = UsuariosServicios.UsServIdUs WHERE (((Clientes.UsIdCli)=2 AND USUARIOS.UsIdCli=3)) group by Servicios.ServNombre, TipoServicio.TipoNombre;

Y después en tu code, si el usuario NO TIENE el servicio te devolverá NULL EN SERVNOMBRE y sí que está concatenado te devolverá el nombre.

mi pregunta es, porque concatenas los usuarios con los clientes y éstos con los servicios en vez de concatenar los usuarios con los servicios???
  #16 (permalink)  
Antiguo 04/05/2005, 05:30
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
Para mi la relacion es de clientes a usuarios y de usuarios a servicios. La sql que me has puesto no devuelve ningun registro:

SELECT Servicios.ServNombre, TipoServicio.TipoNombre, Usuarios.UsId
FROM Clientes LEFT OUTER JOIN
Usuarios ON Clientes.UsIdCli = Usuarios.UsIdCli INNER JOIN
TipoServicio INNER JOIN
Servicios INNER JOIN
UsuariosServicios ON Servicios.ServId = UsuariosServicios.UsServIdServ ON TipoServicio.TipoId = Servicios.ServIdTipo ON
Usuarios.UsId = UsuariosServicios.UsServIdUs
WHERE (Clientes.UsIdCli = 2) AND (Usuarios.UsIdCli = 3)
GROUP BY Servicios.ServNombre, TipoServicio.TipoNombre, Usuarios.UsId
Le hemetido el usuarios.UsId en el group by.

Que de lo de las relaciones las tablas me las han dado ya diseñadas.
  #17 (permalink)  
Antiguo 04/05/2005, 05:48
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Uy perdón con esta en teoría ya no te hace fata el group by (joder, que lio llevo y yo que me creia bueno con el sql, vamos por partes, ok?? haber prueba con esto


SELECT Servicios.ServNombre, UsuariosServicios.UsId
from
Servicios left outer join UsuarioServicios on Servicios.ServId=Us.ServIdSer
WHERE (ServId.UsIdCli = 3) or UsuariosServicios is null

Esto te debería dar todos los servicios del usuario y así como los que no tiene, sin repeticiones ni historias, me equivoco??
  #18 (permalink)  
Antiguo 04/05/2005, 05:52
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Ahora concatenamos con el tipo de servicio, ok???

SELECT Servicios.ServNombre,TipoServicio.TipoNombre, UsuariosServicios.UsId
from
Servicios
inner join TipoServicio on TipoServicio.TipoId=Servicios.ServIdTipo
left outer join UsuarioServicios on Servicios.ServId=Us.ServIdSer
WHERE (ServId.UsIdCli = 3) or UsuariosServicios is null

Estamos guay, no???

Ahora sólo nos falta que nos muestre sólo los del usuario 3 que concatena con el cliente 2, ok??
  #19 (permalink)  
Antiguo 04/05/2005, 05:57
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Perdón

SELECT Servicios.ServNombre,TipoServicio.TipoNombre, UsuariosServicios.UsId
from
Servicios
inner join TipoServicio on TipoServicio.TipoId=Servicios.ServIdTipo
left outer join UsuariosServicios on Servicios.ServId=UsuariosServicios.ServIdSer
WHERE (ServId.UsIdCli = 3) or UsuariosServicios.UsServIdUs is null
  #20 (permalink)  
Antiguo 04/05/2005, 05:58
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Espera, me tengo que ir obligao, dentro de un rato te sigo diciendo, dime si va bien la cosa, ok??
  #21 (permalink)  
Antiguo 04/05/2005, 06:03
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años
Puntos: 8
Y con esto deberíamos concatenar con clientes, en caso de que tenga el servicio el usaurio indicado (aunque creo que para lo que buscas sobra esta última)

SELECT Servicios.ServNombre,TipoServicio.TipoNombre, UsuariosServicios.UsId
from
Servicios
inner join TipoServicio on TipoServicio.TipoId=Servicios.ServIdTipo
left outer join UsuariosServicios on Servicios.ServId=UsuariosServicios.ServIdSer
left outer join Clientes on Clientes.UsIdCli=Usuarios.UsIdCli
WHERE (ServId.UsIdCli = 3) or UsuariosServicios.UsServIdUs is null
  #22 (permalink)  
Antiguo 04/05/2005, 07:12
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
He leido la esplicacion d elo que kieres hacer
Te gustaria que aparezcan todos los servivios,saber a que usuario estan relacionados
Pero si hay dos usuarios que tienen un mismo servicio,que todo aparezca en una misma linea??? es decir concatenar los nombres d elos usuarios??? o el id q es como lo tienes en esta ejemplo d elo que te mostraba;
ServNombr TipoNombre UsId
Lan/Wan Alcobendas Lan/Wan 3
Lan/Wan Valdemoro Lan/Wan 39
Lan/Wan Valdemoro Lan/Wan 3
Lan/Wan Pozuelo Lan/Wan 3
Seguridad Valdemoro Seguridad 39
Seguridad Pozuelo Seguridad 3
Wifi Pozuelo Wifi 3
  #23 (permalink)  
Antiguo 04/05/2005, 07:15
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
ooo

Perdoname a mi tb que he salido a comer. Ahora que veo todo lo que me has puesto te digo:

Con esta conslta SELECT Servicios.ServNombre, TipoServicio.TipoNombre, UsuariosServicios.UsId
FROM Servicios INNER JOIN
TipoServicio ON TipoServicio.TipoId = Servicios.ServIdTipo LEFT OUTER JOIN
UsuariosServicios ON Servicios.ServId = UsuariosServicios.ServIdSer
WHERE (ServId.UsIdCli = 3) OR
(UsuariosServicios.UsServIdUs IS NULL)
Sale: el prefijo de la columna servid no coincide con un nombre de tabla o con un alias usado en la consulta.

Si me dices tu email te puedo enviar la base de datos para que veas las tablas, la pase access.
  #24 (permalink)  
Antiguo 04/05/2005, 07:23
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
eso es neivan

es justo eso lo que quiero. Que si tengo 2 servicios iguales para distintos usuarios, que me muestre solo una vez el servicio.
  #25 (permalink)  
Antiguo 04/05/2005, 07:33
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
Creo que igual te pasa eso por que en la where pones ServId.UsIdCli = 3 en vez de clientes.UsIdCli = 3 ya q USidCli pertenece a la tabla cliente,por lo menos es venia en las anteriores consultas

Otra cosa,podrias utilizar un dataview que filtre el usuario que te aparece en e lcombo

Es decir la consulta te devueve todos los serviicos,pero luego filtras con el dataview dinamicamente por el usuario en cuesto para el chekeo.
  #26 (permalink)  
Antiguo 04/05/2005, 07:37
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
databiew

Si eso del dataview seria como hacerlo con 2 sql igualmente no???? Xq yo ahora le paso el valor del usuario para hacer la sql.
Es decir seria una sql para todos los servicios del cliente y otra para el dataview.
  #27 (permalink)  
Antiguo 04/05/2005, 07:46
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
Tu haces una cosulta y la metes en un dataset,puedes recorrerla mostrarla lo que kieras,este dataset lo puedes emter en un dataview que tiene una propiedad que es añadir una where,un fltrado
Esto te lo comentaba por que tu kieres hacer es por un lado mostrar todos los servicios y despues por otro ver cuales son del usuario y por lo tanto chekearlos.
Pero le he dao un par de vultas y estamos en las mismas ==> habria q recorrer todos los servicios del listado e ir chekeandolos.... un tocho del copon
  #28 (permalink)  
Antiguo 04/05/2005, 07:48
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
dame un par d eminutos pa hace runas pruebas q tengo en mente una solucion a ver si sirve
  #29 (permalink)  
Antiguo 04/05/2005, 07:52
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 7 meses
Puntos: 1
genial

Vale muchas gracias por la ayuda lo malo que todavia no os he dicho creo es que el codigo html esta emdebido en una label, es decir:

Servicios.Text+="<input class='checkbox' id='" + reader4["ServNombre"].ToString() + "' title='" + reader4["ServNombre"].ToString() + "' type='checkbox' CHECKED value='" + reader4["ServNombre"].ToString() + "' name='" + reader4["ServNombre"].ToString() + "'>";
Servicios.Text+=reader4["ServNombre"].ToString();
Servicios.Text+="<br>";

Pero bueno eso en principio no deberia crear problemas
  #30 (permalink)  
Antiguo 04/05/2005, 08:26
Avatar de neivan  
Fecha de Ingreso: febrero-2005
Mensajes: 539
Antigüedad: 19 años, 9 meses
Puntos: 1
Juraria que esto lo he hecho en administracion de oracle cuando nos mandaban hacer esas consultas tan raras q no habia dios q las entendiera y q piensas q estas perdiendo el tiempo por q nadie te va a pedir tales cosas.Jejeje
Los apuntes los tengo en casa.
Dale una vuelta a lo de Jose_minglein2.Yo le voy a mirar un poco mas ,la cosa es q me ha picao lo de esta consulta
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 22:19.