SQL - consulta que involucra inner join minimo y subconsulta

 
Vista:

consulta que involucra inner join minimo y subconsulta

Publicado por mar4612 (2 intervenciones) el 16/03/2012 15:44:38
Hola a todos: tengo una consulta muy dificil y no logro resolverla paso a contarles:

tengo dos tablas
TABLA_1
CAMPO_A.......CAMPO_B
A ...................1000
B....................2000
C....................3000
C....................4000
C ..................5000
D....................6000
E....................7000

haciendo una consulta de la TABLA_1obtengo (aclaro que esta es una consulta)

CAMPO_A ................. CANTIDAD
A.....................................1
B.....................................1
C....................................3
D....................................1
E.....................................1


TABLA_2

CAMPO_A........CAMPO_B.......CAMPO_C
1000.................1........................10
2000.................2........................11
3000.................3........................12
4000.................3........................13
5000.................3........................14
6000.................4........................10
7000.................5........................20

el resultado que quiero obtener es el siguiente:
CAMPO_A ............CAMPO_B..............CAMPO_C
(TABLA_1)............(TABLA_2).............(TABLA_2)
C.........................3...................................12...... -->EL VALOR MINIMO

solo aquellas filas cuyas cantidades sean mayor que 1. Tengo esta consulta pero no obtengo los resultados deseados:


select t1.campo_A, t2.campo_A, t2.campo_B from tabla_1 t1 inner join tabla_2 t2 on t1.campo_A = t2.campo_A where (t2.campo_C=(select min(t2.campo_C) from tabla_2 t3 where t3.campo_A=t2.campo_A)) group by t1.campo_A, t2.campo_A, t3.campo_B having count(t1.campo_A)>1

Espero que se entienda el problema y me puedan ayudar. Gracias de antemano..
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

consulta que involucra inner join minimo y subconsulta

Publicado por leonardo_josue (1173 intervenciones) el 16/03/2012 16:58:33
Hola mar4612:

No estoy seguro se si entendí bien la estructura de tus tablas, pero a partir de tus datos obtuve esta consulta:

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
35
36
37
38
39
40
41
42
43
44
mysql> SELECT * FROM tabla_1;
+---------+---------+
| CAMPO_A | CAMPO_B |
+---------+---------+
| A       |    1000 |
| B       |    2000 |
| C       |    3000 |
| C       |    4000 |
| C       |    5000 |
| D       |    6000 |
| E       |    7000 |
+---------+---------+
7 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla_2;
+---------+---------+---------+
| CAMPO_A | CAMPO_B | CAMPO_C |
+---------+---------+---------+
|    1000 |       1 |      10 |
|    2000 |       2 |      11 |
|    3000 |       3 |      12 |
|    4000 |       3 |      13 |
|    5000 |       3 |      14 |
|    6000 |       4 |      10 |
|    7000 |       5 |      20 |
+---------+---------+---------+
7 rows in set (0.00 sec)
 
mysql> SELECT Ty.CAMPO_A, T2.CAMPO_B, MIN(CAMPO_C) CAMPO_C
    -> FROM tabla_2 T2 INNER JOIN
    -> (
    ->   SELECT T1.* FROM tabla_1 T1 INNER JOIN
    ->   (  SELECT CAMPO_A, COUNT(CAMPO_A) FROM tabla_1
    ->      GROUP BY CAMPO_A
    ->      HAVING COUNT(CAMPO_A) > 1
    ->   ) Tx ON T1.CAMPO_A = Tx.CAMPO_A
    -> ) Ty ON Ty.CAMPO_B = T2.CAMPO_A
    -> GROUP BY Ty.CAMPO_A, T2.CAMPO_B;
+---------+---------+---------+
| CAMPO_A | CAMPO_B | CAMPO_C |
+---------+---------+---------+
| C       |       3 |      12 |
+---------+---------+---------+
1 row in set (0.00 sec)


Aquí se utiliza una doble anidación (no encontré otra forma más fácil de realizarla, igual y después se me ocurre una forma para optimizarla la publico), la primer subconsulta a considerar sería la misma que pones como tu primer consulta:

1
2
3
4
5
6
7
8
9
mysql> SELECT CAMPO_A, COUNT(CAMPO_A) FROM tabla_1
    ->      GROUP BY CAMPO_A
    ->      HAVING COUNT(CAMPO_A) > 1;
+---------+----------------+
| CAMPO_A | COUNT(CAMPO_A) |
+---------+----------------+
| C       |              3 |
+---------+----------------+
1 row in set (0.00 sec)


Es decir, obtengo los registros de la Tabla_1 que tienen un count > 1, en este caso sólo serían los que tienen C.

La segunda parte sería obtener los códigos asignados a este registro que se van a utilizar en la tabla 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT T1.* FROM tabla_1 T1 INNER JOIN
    ->   (  SELECT CAMPO_A, COUNT(CAMPO_A) FROM tabla_1
    ->      GROUP BY CAMPO_A
    ->      HAVING COUNT(CAMPO_A) > 1
    ->   ) Tx ON T1.CAMPO_A = Tx.CAMPO_A;
+---------+---------+
| CAMPO_A | CAMPO_B |
+---------+---------+
| C       |    3000 |
| C       |    4000 |
| C       |    5000 |
+---------+---------+
3 rows in set (0.00 sec)


Esta es la que te va a servir para filtrar todos los registros de tu tabla_2... finalmente utilizas la función MIN para obtener sólo el mínimo. Dale un vistazo para ver si te sirve y cualquier detalle lo comentas en el foro.

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

consulta que involucra inner join minimo y subconsulta

Publicado por mar4612 (2 intervenciones) el 19/03/2012 19:40:43
Muchas gracias, era lo que buscaba.Gracias!
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