SQL - Duda en Select con dos tablas

 
Vista:

Duda en Select con dos tablas

Publicado por toti (11 intervenciones) el 21/02/2014 08:04:26
Hola, tengo dos tablas:

t1 --> id_t1, campo1, campo2, .... (clave id_t1)
t2 --> id_t2, id_t1,valor (clave id_t2 + id_t1)

si id_t2 = 4 el campo t2.valor guarda un tipo de información ( el perfil )
si id_t2 = 6 el campo t2.valor guarda otro tipo de información ( el método )

quiero hacer una select para sacar la información de t1 y para cada fila sacar el valor correspondiente
del campo valor de la tabla2, es decir, el campo t2.valor debe rellenar dos campos de la select dependiendo si
el campo t2.id_t2 tiene el valor 4 o 6

sería algoparecido a esto :

select t1.campo1, t1.campo2, perfil, metodo
from t1 inner join t2 on t1.id_t1 = t2.id_t1
where t1.id_t1 = 14589

pero no consigo sacar el perfil y el método correctamente, alguien sabe cómo hacerlo

gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda en Select con dos tablas

Publicado por leonardo_josue (1173 intervenciones) el 21/02/2014 18:12:53
Hola toti... no me queda claro cómo tienes relacionadas tus tablas... es conveniente que nos pongas algunos datos de ejemplo de cada una por separado y que a partir de esos datos de ejemplo nos digas qué es lo que esperas como salida.

También es importante que nos menciones con qué BD estás trabajando, pues aunque la mayoría está basado en SQL, existen diferencias importantes en cuanto a sintaxis entre cada uno de ellos.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda en Select con dos tablas

Publicado por toti (11 intervenciones) el 22/02/2014 14:26:29
Hola Leo, antes de nada, muchísimas gracias por tu tiempo

Estoy utilizando mysql.
La tabla2 se realaciona con la tabla1 por el campo id_t1.
Por cada fila de la tabla1 hay varias filas en la tabla2 relacionadas por la clave ajena
En la tabla2 no puede haber dos registros con (ID_T2+ID_T1) iguales porque es la clave


Tabla1:
ID_T1 nombre descripcion
14589 CaptarDatos Proceso de Captación de datos
16498 EvaluarDatos Proceso de evaluación de datos

Tabla2:
ID_T2 ID_T1 valor
4 14589 Encuestador
6 14589 Encuesta Telefónica
4 16498 Analista
6 16498 Método Inferencial


La salida que espero es : (no pongo todos los campos porque son muchos pero lo importante es:)

ID: Proceso: Descripción: Perfil: Método:
14589 CaptarDatos Proceso de Captación de datos Encuestador Encuesta Telefónica
16498 EvaluarDatos Proceso de Evaluación de datos Analista Método Estadístico Inferencial
...

Lo dicho, muchas gracias

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda en Select con dos tablas

Publicado por leonardo_josue (1173 intervenciones) el 22/02/2014 22:14:46
Hola de nuevo Toti:

antes que nada te comento que tienes un mal diseño de base de datos... pero bueno, creo que ya te habrás dado cuenta de por qué motivo es este comentario, lo correcto es que tengas dos tablas, una para los perfiles y otra para los métodos, no importa que tengan la misma estructura... tu tabla 1 por lo tanto debería tener dos llaves foráneas (una para cada tabla). Si tienes oportunidad aun de modificar tu modelo, hazlo, te evitarás dolores de cabeza futuros.

ahora bien, como en ocasiones no es posible modificar tu modelo de base de datos (siempre que tengas una razón de peso, la pereza no cuenta como razón), lo que puedes hacer es "simular" que tienes dos tablas y hacer un doble JOIN... para esto es necesario el uso de ALIAS de Tablas, y agregar un filtro en cada INNER JOIN para filtrar solo un tipo de id... sería asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
mysql> SELECT * FROM tabla1;
+-------+--------------+---------------------------------+
| ID_T1 | nombre       | descripcion                     |
+-------+--------------+---------------------------------+
| 14589 | CaptarDatos  | Proceso de Captación de datos   |
| 16498 | EvaluarDatos | Proceso de evaluación de datos  |
+-------+--------------+---------------------------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+-------+-------+----------------------+
| ID_T2 | ID_T1 | valor                |
+-------+-------+----------------------+
|     4 | 14589 | Encuestador          |
|     6 | 14589 | Encuesta Telefónica  |
|     4 | 16498 | Analista             |
|     6 | 16498 | Método Inferencial   |
+-------+-------+----------------------+
4 rows in set (0.00 sec)
 
mysql> SELECT T1.*, T2_A.valor perfil, T2_B.valor metodo
    -> FROM
    -> tabla1 T1
    -> INNER JOIN
    -> tabla2 T2_A ON T1.id_T1 = T2_A.Id_T1 AND T2_A.ID_T2 = 4
    -> INNER JOIN
    -> tabla2 T2_B ON T1.id_T1 = T2_B.Id_T1 AND T2_B.ID_T2 = 6;
+-------+--------------+---------------------------------+-------------+----------------------+
| ID_T1 | nombre       | descripcion                     | perfil      | metodo              |
+-------+--------------+---------------------------------+-------------+----------------------+
| 14589 | CaptarDatos  | Proceso de Captación de datos   | Encuestador | Encuesta Telefónica  |
| 16498 | EvaluarDatos | Proceso de evaluación de datos  | Analista    | MétodoInferencial   |
+-------+--------------+---------------------------------+-------------+----------------------+
2 rows in set (0.00 sec)


OJO, debes tener cuidado de colocar dos alias distintos, y en la cláusula ON además de la unión de los campos llaves debes agregar un filtro, en el primero caso para filtrar sólo los ID's = 4 y en la segunda para los ID's = 6

Dale un vistazo, espero que te pueda servir de ayuda. Si continuas con problemas postea algo de lo que intentaste hacer y con gusto te trataremos de ayudar.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda en Select con dos tablas

Publicado por toti (11 intervenciones) el 23/02/2014 14:02:59
Hola Leo, otra vez,

sí sí, tengo claro que el diseño no está nada bien y que habría que cambiarlo, pero se trata de una base de datos de la que tengo que obtener información pero no es mía, pertenece a otra aplicación con la que debo interactuar.

Probaré con tu solución.

Muchísimas gracias

Saludos

Toti
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda en Select con dos tablas

Publicado por toti (11 intervenciones) el 25/02/2014 08:00:29
Buenos días Leo,
probé tu solución pero resulta que no me devuelve todas las filas que contiene la tabla2 si añado AND T2_A.ID_T2 = 4 y AND T2_A.ID_T2 = 6, tampoco todas las filas que cumplen esos dos criterios

Saludos

Toti
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda en Select con dos tablas

Publicado por leonardo_josue (1173 intervenciones) el 25/02/2014 16:53:18
Hola de nuevo:

MUCHO OJO TOTI... creo que no te pusiste a analizar a conciencia la consulta...

1
si añado AND T2_A.ID_T2 = 4 y AND T2_A.ID_T2 = 6

Creo que no observaste correctamente cómo están definidos los filtros... el que filtra los ID's = 4 DEBE ESTAR ASOCIADA AL ALIAS T2_A... mientras que el filtro de los ID's = 6 DEBE ESTAR ASOCIADO AL ALIAS DE LA TABLA T2_B

1
2
3
tabla2 T2_A ON T1.id_T1 = T2_A.Id_T1 AND T2_A.ID_T2 = 4
INNER JOIN
tabla2 T2_B ON T1.id_T1 = T2_B.Id_T1 AND T2_B.ID_T2 = 6;

La consulta funciona con los datos que pusiste de ejemplo, regresa exactamente lo que pides en un inicio, pero si no te sirve, entonces debe ser un problema justamente con los datos... postea nuevamente los datos con los que estás probando para darle un vistazo. postea tambien la consulta tal cual la estás implementando, para ver dónde puede estar el error.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda en Select con dos tablas

Publicado por toti (11 intervenciones) el 26/02/2014 14:25:42
Hola Leo,
los filtros del join estaban bien, el problema surgia por tener en la tabla1 registros que debían salir en la consulta pero que no tenían su correspondiente en la tabla2 para los t2.id 4 y 6 ( tenía otro valor). Lo he solucionado utilizando un LEFT JOIN en lugar de un INNER JOIN

Tabla1:
ID_T1 nombre descripcion
14589 CaptarDatos Proceso de Captación de datos
16498 EvaluarDatos Proceso de evaluación de datos
13222 GenerarInformes Proceso de generación de informes

Tabla2:
ID_T2 ID_T1 valor
4 14589 Encuestador
6 14589 Encuesta Telefónica
4 16498 Analista
6 16498 Método Inferencial
2 13222 Plantilla a utilizar

ID: Proceso: Descripción: Perfil: Método:
14589 CaptarDatos Proceso de Captación de datos Encuestador Encuesta Telefónica
16498 EvaluarDatos Proceso de Evaluación de datos Analista Método Estadístico Inferencial
13222 GenerarInformes Proceso de Generación de Informes N/D N/D

Muchas gracias nuevamente.

Saludos

Toti
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar