tablas - unir dos consultas sql misma tabla
Unión externa izquierda y una cláusula where adicional (5)
Puedes usar
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 solo cuando la tabla 1 no tenga una fila correspondiente en la tabla 2 o la fila correspondiente en la tabla 2 coincida con sus criterios.
Tengo un join en dos tablas definidas como una combinación externa izquierda para que todos los registros se devuelvan desde la tabla de la izquierda, incluso si no tienen un registro en la tabla de la 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?
Sí, pon la condición (llamada predicado) en las condiciones de unió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
Solo necesita 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''
SELECT x.fieldA, y.fieldB
FROM x
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition)
ON x.fieldc = y.fieldc
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 reemplaza el primer argumento por el segundo en caso de que sea null
(que es común para las uniones externas). Puede usar ifnull
o coalesce
para otras bases de datos.
Por lo tanto, compara t2.some_field
con tus criterios de búsqueda si se ha reunido con el predicado join, pero si no lo ha hecho, solo devuelve row desde table1
, porque some_required_value
comparado some_required_value
mismo siempre será verdadero (a menos que sea null
, sin embargo - null = null
produce null
, ni true
ni false
.