Escribí esta consulta en una base de datos de desplazamiento al rojo

with wt_id(id) as (select cast(11646722011 as bigint))
  select 
    w.id, 
    nullif(
      trim(
        regexp_replace(
          json_extract_path_text(bn.foo, 'foo-id'), '\\["(.*)"\\]', '$$1'
        )
      ), '') as foo-id
  from wt_id w left outer join foo bn on w.id = bn.fid
  where bn.day='2019-12-03' 
  limit 1;        

Esta consulta devuelve un conjunto de resultados vacío. Pero, ¿cómo es esto posible? porque hice una unión omitida, debería obtener 1 fila donde la identificación es 11646722011 y la identificación foo puede ser nula si no hay coincidencia en el lado derecho.

0
Knows Not Much 7 dic. 2019 a las 22:47

2 respuestas

Su cláusula where está convirtiendo la combinación externa en una combinación interna porque NULL falla la condición WHERE.

Las condiciones en la tabla segundo en un left join deben estar en la cláusula on. Entonces quieres:

from wt_id w left outer join
     foo bn
     on w.id = bn.fid and bn.day = '2019-12-03' 
2
Gordon Linoff 7 dic. 2019 a las 19:48

Su cláusula where ha provocado la pérdida de datos. Este no es el caso de la combinación izquierda que permite filas no coincidentes, sino de que no hay datos sobre ese día específico después de la combinación izquierda. Por lo tanto, debe reemplazar where con and.

Si vemos el orden de ejecución, el dónde se aplica después de la unión como se indicó anteriormente. Por lo tanto, incluso si las filas se vuelven nulas, se eliminan si la otra condición se cumple como su día.

1
Himanshu Ahuja 7 dic. 2019 a las 20:32