2011-03-08 15 views
8

Cuando hago una combinación externa izquierda, espero obtener todos los registros que devolverá la consulta antes de agregar la tabla unida, pero solo devuelve registros que coinciden con la unión tabla (es decir: no existe registro para '092387' en la tabla 'documentación', por lo que solo quiero que se devuelva nulo para el campo 'nombre de archivo' para ese registro.) ¿Qué estoy haciendo mal?Left Outer Join no devuelve todos los registros de la tabla principal

mysql> select documentation_reference.ref_docnumber 
      , documentation.filename 
     from documentation_reference 
     left outer join documentation on ref_docnumber=documentation.docnumber  
     where documentation_reference.docnumber='TP-036' 
     and documentation.status!=3; 
+---------------+-----------------+ 
| ref_docnumber | filename  | 
+---------------+-----------------+ 
| SOP-0042  | SOP-0042r39.pdf | 
+---------------+-----------------+ 
1 row in set (0.00 sec) 

mysql> select ref_docnumber 
     from documentation_reference 
     where documentation_reference.docnumber='TP-036'; 
+----------------------+ 
| ref_docnumber  | 
+----------------------+ 
| 092387    | 
| 1100218B    | 
| Applicable Item Spec | 
| SOP-0042    | 
+----------------------+ 
4 rows in set (0.00 sec) 

Respuesta

15

Su cláusula where está convirtiendo la unión externa en una interna.

Las filas no coincidentes conservados por el outer join todos tendrán NULL valores para documentation.status por lo que su condición documentation.status != 3 filtrará éstos de vuelta (El resultado de la expresión es NULL !=3unknown no true).

Para evitar este problema, utilice

select documentation_reference.ref_docnumber, 
     documentation.filename 
from documentation_reference 
     left outer join documentation 
     on ref_docnumber = documentation.docnumber 
      and documentation.status != 3 
where documentation_reference.docnumber = 'TP-036' 

Tenga en cuenta que la documentation.status != 3 predicado se trasladó a la condición JOIN.

+0

Derecha ... eso fue todo. Gracias por tu ayuda, tiene sentido. –

0

Revise su condición documentation.status!=3 ... podría ser el culpable ... creo que es la eliminación de los registros esperados.

Por lo general, para depurar este problema de ejecutar la consulta en partes, en primer lugar escorrentías

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber 

verificación de los resultados y luego en Ejecutar consulta con el donde -

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber 
where documentation_reference.docnumber = 'TP-036' 

Compruebe los resultados deben cambiar una vez se agrega a la final donde la condición - documentation.status!=3

probablemente debería seguir el consejo de Martin y ejecutar su código para obtener exp resultados ectivos.

Cuestiones relacionadas