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

[SOLUCIONADO] Negar una consulta SQL

Estas en el tema de Negar una consulta SQL en el foro de SQL Server en Foros del Web. Buenas a toda la Comunidad. Antes de cualquier comentario de parte de ustedes, y se que estoy cometiendo una falta gravisima a las normas del ...
  #1 (permalink)  
Antiguo 21/04/2011, 13:43
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años, 7 meses
Puntos: 7
Pregunta Negar una consulta SQL

Buenas a toda la Comunidad.

Antes de cualquier comentario de parte de ustedes, y se que estoy cometiendo una falta gravisima a las normas del foro y a la comunidad en general al no presentarme y no seguir el conducto regular de todos los usuarios, me disculpo ante ello, pero la promesa es que para unas horas mas tarde me presentare como corresponde. Me podrian perdonar por favor ??

La consulta es la siguiente: Tengo dos tablas, una tabla a que contiene un id (que contiene numeros enteros) y paises (que contiene los nombres de los paises), esta tabla se llama PAISES. Y en otra tabla tengo tambien un id (que tambiien es un valor numerico entero) y una variable celular (que es una valor de numero celular el cual contiene numeros de celulares). tengo una tercera tabla que me indica la signacion de los celulares a los paises correspondientes; esta tabla contiene un id_pais y un id_celular y la tabla se llama asignacion_celulares_a_paises

cuando hago la consulta SQL de cuales son los numeros que estan asignados, no hay nigun problema porque me los muestra todos, pero lo que quiero lograr es que me muestre los que no estan asignados. La consulta que tengo hasta ahora es la siguiente:

SELECT paises.id_interno, celulares.numero_celular
FROM paises, celulares, asignacion_celulares_a_paises AS ac
WHERE ac.id_celular<> celulares.id_celular;

hasta ese minuto estaba bien, pero luego me empezo a lanzar errores, porque me duplicaba alguno de los campos la consulta, y cual lo asignaba, no me los mostraba.

Un importante detalle, lo que hace la consulta anterior es mostrarme aquellos registros que estan en mi tabla celular, pero que NO han sido asignados a la tabla asignacion_celulares_a_paises.

Espero haberme explicado con claridad.

Si necesitan saber mayores detalles, no duden en consultarme, si la verdad es que ya varias vueltas le he dado a mi cabeza en esto.

Gracias a todos.
  #2 (permalink)  
Antiguo 21/04/2011, 15:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Negar una consulta SQL

Código SQL:
Ver original
  1. SELECT paises.id_interno, celulares.numero_celular
  2. FROM celulares
  3. INNER JOIN paises ON (paises.id_interno=celulares.id)
  4. WHERE ac.id_celular NOT IN (SELECT id_celular FROM asignacion_celulares_a_paises WHERE celulares.id=asignacion_celulares_a_paises.id)

Prueba con una consulta como la que te muestro, no pruebes la consulta tal cual ya que no se bien cuales son los id's de las respectivas tablas, espero que esta consulta te sirva de ejemplo :)

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 22/04/2011, 17:06
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años, 7 meses
Puntos: 7
Respuesta: Negar una consulta SQL

Gracias por la respuesta, verificare si ahora no me da error.

en todo caso, ese ejemplo que puse en el post, era un ejemplo como para explicar lo que me sucedia, y la respuesta me ha servido como orientacion a lo que necesito.

PD: por favor no cierren el tema todavia.
  #4 (permalink)  
Antiguo 25/04/2011, 08:09
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años, 7 meses
Puntos: 7
Respuesta: Negar una consulta SQL

Hola libra.

Te quiero dar las gracias por tu respuesta tan rapida, al fin y al cabo no me sirvio ya que la consulta en general no me mostraba lo que queria que me mostrara, y estuve veriguando lo que hacia el INNER JOIN y me di cuenta de que funciona pero para dos tablas, no para 3 como lo queria yo, al fin y al cabo tuve que agregar un campo mas a la tabla que queria discriminar los campos y se resolvio mi problema, aunque no lo queria hacer, tuve que hacerlo.

de antemano gracias por la respuesta y por la rapidez.

PD: Tema Solucionado.
  #5 (permalink)  
Antiguo 25/04/2011, 08:40
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Negar una consulta SQL

En lo que respecta a la propuesta de LIBRAS, debe funcionar, solo que yo siempre recomiendo el NOT EXISTS o EXISTS, ya que el NOT IN, es sumamente lento.

En cuanto a la respuesta de MAX, hay muchas forma de "matar una pulga" y creo que lanzandole una bomba atomica, no es la correcta.
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 26/04/2011, 14:05
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años, 7 meses
Puntos: 7
Respuesta: Negar una consulta SQL

Hola iislas

Comparto muy bien tu respuesta, ya que le di solo una solucion parche a lo que de verdad queria hacer, entiendo perfectamente que no era la mejor forma de solucionarlo.

En cuanto a la solucion, si bien la solucion entregada por Libras me funciono y logre realizar la consulta como lo queria, pero solo lo pude realizar con el NOT IN, ya que el NOT EXISTS me lanzaba error. Si bien diran de que deberia funcionar, pero en la practica no funciona muy bien, pero el NOT IN me resulto de maravilla.

Ahora en cuanto a la lentitud, tienes la razon, pero no entiendo muy bien la diferencia de rapidez entre una clausula y otra.

iislas
Si fueras tan amable de poder diferenciarme la velocidad, me puedo cambiar lo mas bien de clausula.
  #7 (permalink)  
Antiguo 26/04/2011, 15:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Negar una consulta SQL

Hola max_mouse699:

Con permiso de los compañeros Iislas y Libra.

Como comenta el compañero Iislas no es recomendable utilizar las sentencias IN y NOT IN, ya que estás son soluciones muy lentas comparadas por ejemplo con EXISTS. en tu post dices

Cita:
Si bien diran de que deberia funcionar, pero en la practica no funciona muy bien
La sentencia funciona SIEMPRE y BIEN, el problema es que pongas la sintaxis correcta. Para convertir la solución que te dio el compañero Libra con EXISTS sería más o menos así:

Código SQL:
Ver original
  1. FROM celulares C
  2. INNER JOIN paises P ON P.id_interno=C.id
  3. WHERE NOT EXISTS (
  4. SELECT id_celular
  5. FROM asignacion_celulares_a_paises ACP
  6. WHERE C.id=ACP.id
  7. )

Si la sentencia te marca un error o no te regresa los resultados que estás esperando coméntanos más acerca de estos problemas, para ayudarte a afinar la sentencia.

También mencionas lo siguiente:

Cita:
y estuve veriguando lo que hacia el INNER JOIN y me di cuenta de que funciona pero para dos tablas, no para 3 como lo queria yo
Tú puedes hacer TANTOS JOIN'S (INNER, LEFT, RIGHT) como lo deseas, otra vez, el punto es que tengas la sintaxis correcta, en mi he manejado JOIN'S con más de 10 tablas sin ningún problema.

Saludos
Leo.

Etiquetas: negar, sql
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 06:53.