2014-11-01 65 views
1

晚上好! 我有问题,因为我不能在WHERE和 ORDER BY中使用MAXGROWTHPARENT值。 我写了这条查询:POSTGRESQL:在WHERE子句中使用之前的计算值

SELECT PERSON.*, 
(
    SELECT MAX(PARENT.GROWTH) 
    FROM MAN PARENT 
    WHERE 
     (PARENT.ID = PERSON.ID_FATHER) 
    OR 
     (PARENT.ID = PERSON.ID_MOTHER) 
) AS MAXGROWTHPARENT 
FROM MAN PERSON 
WHERE PERSON.GROWTH > 
(
    SELECT MAX(PARENT.GROWTH) 
    FROM MAN PARENT 
    WHERE 
     (PARENT.ID = PERSON.ID_FATHER) 
    OR 
     (PARENT.ID = PERSON.ID_MOTHER) 
) 
ORDER BY (PERSON.GROWTH - 
    (
     SELECT MAX(PARENT.GROWTH) 
     FROM MAN PARENT 
     WHERE 
      (PARENT.ID = PERSON.ID_FATHER) 
     OR 
      (PARENT.ID = PERSON.ID_MOTHER) 
    ) 
); 

我的代码看起来非常难看。你能告诉我如何在WHERE和ORDER BY子句中使用MAXGROWTHPARENT ?

回答

1

我觉得两个独立的加入可以更好地工作:

select p.*, greatest(pf.growth, pm.growth) as MAXGROWTHPARENT 
from man p left join 
    man pf 
    on p.id_father = pf.id_father left join 
    man pm 
    on p.id_mother = pm.id_mother 
order by p.growth - greatest(pf.growth, pm.growth); 

注:如果连接可能不匹配,你可能更喜欢:

select p.*, greatest(coalesce(pf.growth, pm.growth), coalesce(pm.growth, pf.growth)) as MAXGROWTHPARENT 
from man p left join 
    man pf 
    on p.id_father = pf.id_father left join 
    man pm 
    on p.id_mother = pm.id_mother 
order by p.growth - greatest(coalesce(pf.growth, pm.growth), coalesce(pm.growth, pf.growth));