2010-09-09 4 views
24

Tengo una combinación en dos tablas definidas como una combinación externa izquierda para que todos los registros se devuelvan desde la tabla izquierda incluso si no tienen un registro en la tabla derecha. Sin embargo, también necesito incluir una cláusula where en un campo de la tabla de la derecha, pero .... Todavía quiero que se devuelva una fila de la tabla de la izquierda para cada registro en la tabla de la izquierda, incluso si el condición en la cláusula where donde no se cumple. ¿Hay alguna forma de hacer esto?Unión externa izquierda y una cláusula adicional donde

Respuesta

20

Sí, puso la condición (llamado un predicado) en las condiciones de combinación

Select [stuff] 
    From TableA a 
     Left Join TableB b 
      On b.Pk = a.Pk 
       -- [Put your condition here, like this] 
       And b.Column = somevalue 
10

Usted sólo tiene que poner el predicado en la condición JOIN. Poniéndolo en la cláusula WHERE convertiría efectivamente su consulta en una unión interna.

Por ejemplo:

... 
From a 
Left Join b on a.id = b.id and b.condition = 'x' 
1
SELECT x.fieldA, y.fieldB 
FROM x 
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition) 
ON x.fieldc = y.fieldc 
0
select * 
    from table1 t1 
    left outer join table2 t2 on t1.id = t2.id 
where t1.some_field = nvl(t2.some_field, t1.some_field) 

UPD: errr ... no. de esta manera:

select * 
    from table1 t1 
    left outer join table2 t2 on t1.id = t2.id 
where some_required_value = nvl(t2.some_field, some_required_value) 

nvl es una sintaxis de Oracle que sustituye primer argumento con segundos en caso de que sea null (que es común para combinaciones externas). Puede usar ifnull o coalesce para otras bases de datos.

Por lo tanto, comparar t2.some_field con sus criterios de búsqueda si se ha cumplido unirse predicado, pero si no es así, entonces usted acaba de regresar fila de table1, porque some_required_value comparó a sí mismo siempre será verdad (a menos que sea null, sin embargo - null = null rendimientos null, ni true no false

2

le ofrecemos

WHERE (right_table.column=value OR right_table.column IS NULL) 

Esto devolverá todas las filas de la tabla 1 y la tabla 2, pero sólo cuando planees. re tabla 1 no tiene una fila correspondiente en la tabla 2 o la fila correspondiente en la tabla 2 coincide con su criterio.

+0

Esto no funciona en ECC6 –

Cuestiones relacionadas