From: | Juan Martínez <jeugenio(at)umcervantes(dot)cl> |
---|---|
To: | "Alejandro D(dot) Burne" <alejandro(dot)dburne(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Error en consulta |
Date: | 2007-07-18 00:57:29 |
Message-ID: | 50009.190.44.86.211.1184720249.squirrel@correo.umcervantes.cl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El Mar, 17 de Julio de 2007, 2:39 pm, Alejandro D. Burne escribió:
> Compañeros, probablemente tenga un arbol delante mío que no me deja
> ver el bosque, pero tengo estas 2 tablas que cuando quiero hacer una
> subconsulta me da un resultado errático desde mi punto de vista;
> alguien que me pueda echar una mano:
Mmm... digamos lo siguiente (para ahorra bytes en mi cabeza):
clp = CodigoLiquidacionProfesional
llpp = LiquidacionesProfesionales
Entonces, luego:
> AMR=# SELECT clp FROM llpp WHERE clp=299549;
> clp
> --------
> 299549
> (1 row)
>
> AMR=# SELECT clp FROM Caja WHERE clp=299549;
> clp
> -----
> (0 rows)
>
> AMR=# SELECT clp FROM llpp
> WHERE clp=299549 AND clp NOT IN (SELECT clp FROM Caja);
> clp
> -----
> (0 rows)
Hasta aqui ya sabemos que el valor 299549 no esta en el atributo caja.clp
pero si está en llpp.clp
Entonces en el WHERE, la primera expresion es verdadera (eso ya lo
sabiamos!) y la segunda falsa, por que?
Porque el IN es un operador que ahorra escritura al momento de evaluar una
_igualdad_ de un atributo con varios valores (se transforma en un _OR_),
luego el NOT convierte la comparacion (evaluacion) en el operador distinto
(o no igual). La unica manera de que la segunda expresion del WHERE sea
verdadera es que 299549 sea un valor para Caja.clp, como ya sabemos que no
esta, entonces es falsa. Se entiende?
> AMR=# SELECT clp FROM llpp
> WHERE clp=299549 AND clp NOT IN (SELECT clp FROM Caja
> WHERE clp=299549);
> clp
> --------
> 299549
> (1 row)
La primera expresion del WHERE mas externo, es verdadera (ya lo sabiamos!)
y la segunda tambien! por que? Porque llpp.clp es distinto de NULL
(recuerda que ya sabemos que llpp.clp tiene el valor 299549, entonces
299549 <> NULL).
> La versión de postgres, si ya sé es un poco vieja; no me reten =), es
> PostgreSQL 8.1.1
No es tan vieja, pero la verdad que un error de estos (de evaluacion
logica) seria catastrofico para postgres...
--
Juan Martinez Linux user # 335778
Departamento de Informática 499 7934 - 499 7992
Universidad Miguel de Cervantes Mac Iver # 370 - Stgo. Centro - RM
From | Date | Subject | |
---|---|---|---|
Next Message | Gabriel Hermes Colina Zambra | 2007-07-18 02:08:44 | Re: constantes y variables |
Previous Message | Alvaro Herrera | 2007-07-17 21:21:51 | Re: constantes y variables |