2013-02-12 29 views
-1

我有一個下面的查詢爲什麼這個錯誤到來的Pos​​tgres

select wbod.subject, wbi.object, 
     age(dod.object,wbod.object) as ageOfPerson 
from wasbornin as wbi, 
    wasbornondate as wbod, 
    diedondate as dod 
where wbi.subject=wbod.subject 
    and wbod.subject=dod.subject 
    and age(dod.object,wbod.object) = (select max(age(dod1.object,wbod1.object)) 
            from wasbornin as wbi1, 
            wasbornondate as wbod1, 
            diedondate as dod1 
            where wbi1.subject = wbod1.subject 
            and wbod1.subject=dod1.subject 
            group by wbi1.object) 
group by wbi.object 
ORDER BY wbi.subject; 

但它給下面的錯誤

column "wbod.subject" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: select wbod.subject, wbi.object 

這是爲什麼錯誤來

+3

有什麼不清楚的錯誤消息?您可能需要閱讀以下手冊:http://www.postgresql.org/docs/current/static/tutorial-agg.html – 2013-02-12 15:40:49

+0

由wbi.subject訂購,因此需要分組 – CR41G14 2013-02-12 15:41:26

回答

2

這是因爲您選擇此列。如果給定組(GROUP BY wbi.object),則有150個不同的主題,哪一個應該返回?

我最初誤讀了查詢 - 順序是使用wbi.subject,但錯誤是關於wbod.subject。

+0

爲什麼'order by'導致這個?選擇列表中有非聚合列,它們不是「group by」的組成部分。 – 2013-02-12 15:47:11

+0

很難肯定地說,需要查看所有表格的\ d。它也可能只是它報告的第一個字段,如果你要修復它,還會顯示另一個錯誤。 – 2013-02-12 16:50:45

+0

我誤讀了原始查詢 - 按順序不使用錯誤列 - 類似的名稱,另一個表。這實際上給了上面的想法更多的可信度,它只是第一個錯誤報告。 – 2013-02-12 16:53:20

1

如果我正確理解您的查詢,你其實並不需要由子查詢或組:

select subject, 
     object, 
     ageOfPerson 
from (
    select wbod.subject, 
      wbi.object, 
      age(dod.object, wbod.object) as ageOfPerson, 
      dense_rank() over (partition by dod.subject order by age(dod.object, wbod.object) desc) as rnk 
    from wasbornin as wbi 
     join wasbornondate as wbod on wbi.subject=wbod.subject 
     join diedondate as dod on wbod.subject=dod.subject 
) t 
where rnk = 1; 
+0

將要形成的查詢是 - 「對於每個出生地點,找到當前已經死亡的人,並且居住時間最長的人。列出出生者的姓名,出生地和死亡年齡。這個人的名字。「 – neel 2013-02-12 15:48:09

+0

@neel:表格中沒有「人員姓名」。只有科目。 '對象'列似乎是'日期'列,這使得你的表格更難理解,除非'年齡'不是內置的年齡函數,而是你自己寫的。 – 2013-02-12 15:50:14

+0

題目是在wasbornondate,diedondate,livesin,wasbornin表和物體的名稱在wassentondate和diedondate中的日期,而object是地名和wasbornin – neel 2013-02-12 15:53:24