Hasta ahora, has aprendido a usar las uniones internas para emparejar filas en tablas separadas. SQL Server construyó los resultados de una consulta de unión interna filtrando las filas que no cumplían las condiciones expresadas en el predicado de la cláusula ON. El resultado es que sólo se mostraban las filas que coincidían de ambas tablas. Con una unión externa, puede elegir mostrar todas las filas de una tabla, junto con las que coinciden de la segunda tabla.
Aquí hay algunas notas importantes sobre las uniones externas:
- Las uniones externas devuelven todas las filas de una mesa y las filas coincidentes de la segunda mesa.
- En los casos en que la unión no puede encontrar registros coincidentes de la segunda tabla, los resultados de la segunda tabla se muestran como NULL.
- A diferencia de las uniones internas, el orden en que las mesas se enumeran y se unen en la cláusula FROM sí importa, ya que determinará si eliges IZQUIERDA o DERECHA para tu unión.
A continuación, se devolverán todas las filas del primer cuadro (a) y sólo las filas coincidentes del segundo cuadro (b).
12DESDE UNA UNIDAD EXTERIOR IZQUIERDA bon a.id = b.id
A continuación, se devolverán todas las filas del segundo cuadro (b) y sólo las filas coincidentes del primer cuadro (a).
12DESDE UNA JUNTA EXTERIOR DERECHA bon a.id = b.id
Ejemplo de unión exterior
Considere las tablas de órdenes y artículos utilizadas en el ejemplo de unión interna anterior.
Digamos que tenemos que escribir una consulta para recuperar la orden, la cantidad de la orden, el precio del artículo y el itemdesc de todas las órdenes. Si el pedido no tiene un itemid en la tabla de artículos, los detalles del pedido deben ser devueltos, pero los detalles del artículo deben ser mostrados como NULL.
En tal escenario, se preferiría una JUNTA IZQUIERDA (exterior) porque devolverá todas las filas de la primera tabla y sólo las filas coincidentes de la segunda tabla.
La consulta sería la siguiente.
1234SELECT o.orderid, o.qty, i.itemprice, i.itemdescFROM orders oLEFT JOIN items ion o.itemid = i.itemid
El conjunto de resultados sería el siguiente.
orderidqtyitempriceitemdesc1310stuff245lorum315lorum43NULLNULL