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

Problemas con subconsulta

Estas en el tema de Problemas con subconsulta en el foro de Mysql en Foros del Web. Buenas, llevo ya un buen rato intentando que me funcione una consulta y no consigo hacerlo. Me explico: Tengo dos tablas (empresas1 y empresas2), en ...
  #1 (permalink)  
Antiguo 22/09/2011, 21:02
 
Fecha de Ingreso: octubre-2008
Ubicación: Alicante
Mensajes: 337
Antigüedad: 15 años, 6 meses
Puntos: 9
Problemas con subconsulta

Buenas, llevo ya un buen rato intentando que me funcione una consulta y no consigo hacerlo. Me explico:

Tengo dos tablas (empresas1 y empresas2), en dos BD diferentes cada una. En empresas1 está un listado completo de empresas, y en empresas2 hay sólo unas pocas empresas con el mismo ID que en empresas1.

Quiero que me liste SÓLO las empresas de empresas1 que NO estén en empresas2.

Esta es la sentencia que llevo, pero no lo consigo. Si en empresas2 hay por ejemplo dos empresas, el listado me lo muestra duplicado... si hay tres me los triplica, etc.


Código:
SELECT bd1.empresas1.id, bd1.empresas1.empresa 
FROM bd1.empresas1, bd2.empresas2 
WHERE bd2.empresas2.id!=bd1.empresas1.id ORDER BY bd1.empresas1.empresa
Muchas gracias de antemano... estoy que me tiro de los pelos
  #2 (permalink)  
Antiguo 22/09/2011, 21:28
Avatar de Rodrhigo  
Fecha de Ingreso: septiembre-2011
Ubicación: Temuco-Valdivia-Osorno
Mensajes: 254
Antigüedad: 12 años, 7 meses
Puntos: 48
Respuesta: Problemas con subconsulta

DISTINCT

SELECT DISTINCT bd1.empresas1.id, bd1.empresas1.empresa
FROM bd1.empresas1, bd2.empresas2
WHERE bd2.empresas2.id!=bd1.empresas1.id ORDER BY bd1.empresas1.empresa
  #3 (permalink)  
Antiguo 23/09/2011, 07:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Problemas con subconsulta

SELECT FROM bd1.empresas1 LEFT JOIN bd2.empresas2 ON bd1.empresas1 = bd2.empresas2 WHERE bd2.empresas2 IS NULL
  #4 (permalink)  
Antiguo 23/09/2011, 09:46
 
Fecha de Ingreso: octubre-2008
Ubicación: Alicante
Mensajes: 337
Antigüedad: 15 años, 6 meses
Puntos: 9
Respuesta: Problemas con subconsulta

Hola, gracias a los dos

Lo he intentado pero ninguna de las dos formas me hace lo que quiero.

Me devuelve todas las empresas, las que hay en empresas2 también.

Quiero que me liste las empresas de empresas1 que no estén también en empresas2.
  #5 (permalink)  
Antiguo 23/09/2011, 12:11
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 13 años, 7 meses
Puntos: 91
Respuesta: Problemas con subconsulta

En realidad lo que estás haciendo tu es una ensalada con la multiplicación cruzada de las 2 tablas.

Lamentablemente la solución a tu problema es una de las queries temerosas que nunca nadie quiere enfrentar por la inefisciencia que esta presenta, esta solución solo te la recomiendo si ambas tablas no son grandes, porque además las tablas están en bases de datos distintas lo que lo hace peor xD!.

bueno acá va

SELECT bd1.empresas1.id, bd1.empresas1.empresa
FROM bd1.empresas1, bd2.empresas2
WHERE bd2.empresas2.id!=bd1.empresas1.id ORDER BY bd1.empresas1.empresa

Código MySQL:
Ver original
  1. SELECT bd1.empresas1.id, bd1.empresas1.empresa
  2. FROM bd1.empresas1
  3. bd1.empresas.id NOT IN (SELECT bd2.empresas2.id FROM bd2.empresas2);
  4. ORDER BY bd1.empresas1.empresa;


Si no estás haciendo las queries directamente en la base de datos puedes apoyarte con variables en una aplicación para almacenar el listado de ids de la empresas2 y no tener que hacer el select para comparar cada vez:

ejemplo en pseudo codigo

Código PSEUDO-CODIGO:
Ver original
  1. var BD_IDS = QUERY("SELECT ids FROM bd2.empresas");
  2. IDS = UNIR_EN_STRING(BD_IDS); //esto para que quede en la forma 1,2,4,56,21,78,....... por ejemplo usando implode en PHP
  3.  
  4. //y despues haces la query
  5. var IDS_DISTINTOS = QUERY("SELECT id,empresa FROM bd1.empresas WHERE id NOT IN (IDS)");

eso es más efisciente porque hace la query para traer los IDS de la empresa 2 una sola vez.
en el otro caso hace un SELECT por cada ID de la empresa 1.

Espero te sirva de ayuda ;)
  #6 (permalink)  
Antiguo 23/09/2011, 17:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas con subconsulta

Cita:
Iniciado por manolo_manolo Ver Mensaje
Hola, gracias a los dos

Lo he intentado pero ninguna de las dos formas me hace lo que quiero.

Me devuelve todas las empresas, las que hay en empresas2 también.

Quiero que me liste las empresas de empresas1 que no estén también en empresas2.
Disculpa que disienta, pero la consulta que te propone Jurena te debe dar precisamente eso.
LEFT JOIN devuelve todo lo que está en la tabla izquierda, haya o no coincidencias con la tabla derecha. Pero cuando se indica que sólo devuelva aquellos registros de la primera tabla que no tengan su correspondiente coincidencia con la segunda (bd1.empresas2 IS NULL), precisamente excluye todos aquellos que aparezcan en ambas.

La única posibilidad para que no salga así es que no estés respetando la sintaxis propuesta por Jurena:
Código MySQL:
Ver original
  1. SELECT B1.*
  2. FROM bd1.empresas1 B1 LEFT JOIN bd2.empresas2 B2 ON B1.empresa_id = B2.empresa_id
  3. WHERE B2.empresa_id IS NULL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 23/09/2011, 23:13
 
Fecha de Ingreso: octubre-2008
Ubicación: Alicante
Mensajes: 337
Antigüedad: 15 años, 6 meses
Puntos: 9
Respuesta: Problemas con subconsulta

Tenías razón gnzsoloyo, el código de Jurena funcionaba, pero me faltaba añadir los campos id! Fallo mio, llevaba un lío con las 2 bases de datos que no me aclaraba. Ahora ya lo veo claro también gracias a tu explicación. No conseguía entender exactamente el JOIN.

Muchas gracias también a Ribon por su tiempo, también me sirvió de ayuda.

Sois todos unos cracks!! Gracias!!!!

Etiquetas: select, subconsulta, tabla
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 02:41.