SQL - Consulta con campos NULL

 
Vista:
sin imagen de perfil

Consulta con campos NULL

Publicado por Alexis A. (2 intervenciones) el 01/02/2018 14:00:37
Buenas. Como están?

Tengo el siguiente caso que me está haciendo recalentar un poco las neuronas jaja.
Tengo 2 tablas de datos (*testeos - *Pruebas) y una tercer tabla que vincula los testeos y las pruebas (*Resultados) con los resultados de dichas pruebas y testeos.


DB


Al realizar la consulta deseo obtener (PRUEBAS.Prueba, TESTEOS.Testeo, RESULTADOS.Resultado) sin embargo no todos los registros cuentan con una prueba y un testeo.


tablaresultados

Esto hace que al realizar la consulta de la siguiente forma:

[SELECT PRUEBAS.Prueba, TESTEOS.Testeo, RESULTADOS.Resultado FROM TESTEOS, PRUEBAS, RESULTADOS WHERE PRUEBAS.id_Prueba=RESULTADOS.Fk_Prueba and TESTEOS.Id_Testeo=RESULTADOS.Fk_testeo]

Se omitan los registros que tienen NULL en alguna de las FK.


Por lo que probé con la siguiente consulta:

[SELECT PRUEBAS.Prueba, TESTEOS.Testeo, RESULTADOS.Resultado FROM TESTEOS, PRUEBAS, RESULTADOS WHERE (PRUEBAS.id_Prueba=RESULTADOS.Fk_Prueba and RESULTADOS.Fk_testeo IS NULL) OR (RESULTADOS.Fk_Prueba IS NULL and TESTEOS.Id_Testeo=RESULTADOS.Fk_testeo) OR ( PRUEBAS.id_Prueba=RESULTADOS.Fk_Prueba and TESTEOS.Id_Testeo=RESULTADOS.Fk_testeo)]

Arrojandome los valores entremesclados entre las tablas sin mostrar los espacios NULL



consulta-con-null


La pregunta sería; como podría hacer dicha consulta para mostrar los datos con los respectivos nombres de pruebas y testeos para que se vea de la siguiente forma?

RESULTADOS

O bien como me recomendarían hacer la relación de las tablas?
Estoy trabajando con SQL Server 2008.
Desde ya muy agradecido con la ayuda que me puedan dar.
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 con campos NULL

Publicado por Leonardo Josué (1175 intervenciones) el 01/02/2018 15:44:28
Hola Alexis:

Creo que el problema con tu consulta es que estás haciendo JOIN's tipo INNER y para tu caso debería de usar LEFT o RIGTH JOIN, veamos si esto es lo que necesitas.

de acuerdo a lo que entendí, tus tablas tienen más o menos esta información:

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
mysql> SELECT * FROM resultados;
+--------------+-----------+-----------+-----------+
| id_resultado | resultado | fk_prueba | fk_testeo |
+--------------+-----------+-----------+-----------+
|            1 | POSITIVO  |         1 |      NULL |
|            2 | NEGATIVO  |      NULL |         1 |
|            3 | NEGATIVO  |         2 |      NULL |
|            4 | POSITIVO  |      NULL |         1 |
|            5 | POSITIVO  |         2 |         3 |
+--------------+-----------+-----------+-----------+
5 rows in set (0.02 sec)
 
mysql> SELECT * FROM pruebas;
+-----------+----------+
| id_prueba | prueba   |
+-----------+----------+
|         1 | prueba 1 |
|         2 | prueba 2 |
+-----------+----------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM testeos;
+-----------+----------+
| id_testeo | testeo   |
+-----------+----------+
|         1 | testeo 1 |
|         2 | testeo 2 |
|         3 | testeo 3 |
+-----------+----------+
3 rows in set (0.00 sec)

Entonces, lo único que tienes que hacer un LEFT JOIN entre tus tablas. Si no sabes como trabajan los LEFT JOIN, te recomiendo que consultes esta página de SANTA WIKIPEDIA:

https://es.wikipedia.org/wiki/Join

De tal suerte que para que te regrese las descripciones de las pruebas y los testeos, simplemente tienes que hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT r.id_resultado, r.resultado, p.prueba, t.testeo
    -> FROM  resultados r
    -> LEFT JOIN pruebas p ON p.id_prueba = r.fk_prueba
    -> LEFT JOIN testeos t ON t.id_testeo = r.fk_testeo
    -> ORDER BY r.id_resultado;
+--------------+-----------+----------+----------+
| id_resultado | resultado | prueba   | testeo   |
+--------------+-----------+----------+----------+
|            1 | POSITIVO  | prueba 1 | NULL     |
|            2 | NEGATIVO  | NULL     | testeo 1 |
|            3 | NEGATIVO  | prueba 2 | NULL     |
|            4 | POSITIVO  | NULL     | testeo 1 |
|            5 | POSITIVO  | prueba 2 | testeo 3 |
+--------------+-----------+----------+----------+
5 rows in set (0.00 sec)

El ejemplo está en MySQL, pero debe ser válido también para SQL Server. Haz la prueba y nos comentas.

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
1
Comentar
sin imagen de perfil

Consulta con campos NULL

Publicado por Alexis A. (2 intervenciones) el 01/02/2018 16:15:30
Funciono perfecto, no se como no le encontre la logica antes.
Con esto ya me arreglo.
Mil gracias por la rapidez en la respuesta y por tomarte el tiempo de generar las consultas y explicarlo tan bien.
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