Re: [pgsql-es-ayuda] query con resultado extraño

From: Jaime Casanova <jaime(at)2ndquadrant(dot)com>
To: FRANCISCO JOSE PALAO VILLANUEVA <fjpv_2000(at)yahoo(dot)es>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] query con resultado extraño
Date: 2014-08-06 04:47:37
Message-ID: CAJKUy5h6QkUfa-z6eUj-VUaFoRiK=-M36u0=OBiyF98eV6BCZw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Wed, Jun 4, 2014 at 2:29 PM, FRANCISCO JOSE PALAO VILLANUEVA
<fjpv_2000(at)yahoo(dot)es> wrote:
> Hola,
> tengo una query de la siguiente manera:
>
> Select t1.pd_id,count(t2.pc_id) as truta,t2.pr_id from p_d t1 left outer
> join p_c t2 on t1.pd_id=t2.pd_id where (t1.pov_id = 805 or t1.pd_zona='2' or
> t1.pd_zona='3' or t1.pd_zona='7') and t2.pbv_id = 805 and t2.pc_tipocli = 1
> and t2.pr_id < 11 and t2.pc_d5 < '01/02/2014' and t2.pc_pc between 0 and 999
> group by t1.pd_id,t2.pr_id order by t1.pd_id,t2.pr_id
>
> Bien esta me devuelve sólo tuplas donde t1.pd_id=t2.pd_id ??? es un left
> outer join, debería devolver todas las tuplas de la tabla p_d que cumplan
> que la condición (t1.pov_id = 805 or t1.pd_zona='2' or t1.pd_zona='3' or
> t1.pd_zona='7') y las que no se crucen con valores de la tabla p_c debería
> devolver por ejemplo:
> 490,null,null
> Por lo menos así lo hace la base de datos desde donde estoy migrando.
>

Saludos,

Lamentablemente eso solo significa que el gestor de base de datos del
cual estas migrando
no está acatando algo básico del estándar SQL.

Aun en la versión de 1992 (hace 22 años), el estándar decía en el
capítulo 7 clausula 7.6 que
los filtros de la clausula WHERE se aplican *después* de obtener un
conjunto de resultados
de la clausula FROM.

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
"""
7.6 <where clause>

Function

Specify a table derived by the application of a <search condition>
to the result of the preceding <from clause>.
"""

Lo que esto implica es que cuando en la clausula WHERE tienes una
condición como
"and t2.pbv_id = 805" le estas diciendo que del conjunto de resultados
que ya obtuvo del
FROM (y en el cual hay registros con valores NULL cuando no había
correspondiente en
t2) deje solo aquellos en los que t2.pbv_id sea igual a 805 y como
NULL no es igual a 805
elimina todos los registros con NULL. Y así con las demás condiciones
sobre t2 que
implican IS NOT NULL (todo aquello que pregunte por un valor conocido
o un rango de
valores conocidos).

--
Jaime Casanova www.2ndQuadrant.com
Professional PostgreSQL: Soporte 24x7 y capacitación
Phone: +593 4 5107566 Cell: +593 987171157

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Luis Fernando Ortiz Vera 2014-08-07 15:41:11 CONSULTA QUE MUESTRE EL ESQUEMA DE TABLAS Y VISTAS DE LA DB
Previous Message Hellmuth Vargas 2014-08-06 01:21:22 Re: consulta sobre Data Checksums en replicas