2016-06-17 93 views
2

當我選擇列並使用json_build_object時,PostgreSQL 9.5出現問題,我在GROUP BY子句中出現錯誤。使用子查詢時查詢失敗

我有三個表:

Table contact 

    Colonne |   Type   
-----------+-------------------------- 
id  | integer     
lastname | character varying(255) 
firstname | character varying(255) 

此表是接觸

Table companie 

    Colonne |   Type   
-----------+-------------------------- 
id  | integer     
name  | character varying(255) 

的表此表是公司的表

Table companie_contact 

    Colonne |   Type   
-----------+-------------------------- 
id  | integer     
id_c  | integer     
id_cm  | integer     

此表是多對一多對多的關係來連接與公司的聯繫,反之亦然。

當我執行此查詢的所有作品

SELECT co.id, 
json_build_object(
    'lastname', co.lastname, 
    'firstname', co.firstname) AS contact, 
array_agg(c.name) AS companies 
FROM companie AS c 
INNER JOIN companie_contact AS vs 
ON c.id = vs.id_cm 
INNER JOIN contact AS co 
ON co.id = vs.id_c 
GROUP BY co.id; 

我得到

id |     contact     | companies 
----+----------------------------------------------+------------- 
    1 | {"lastname" : "some", "firstname" : "one"} | {A,B,D,E,F} 
    4 | {"lastname" : "some", "firstname" : "two"} | {A} 
    2 | {"lastname" : "some", "firstname" : "three"} | {B} 

但是當我通過查看或子查詢 像下面

-- Imagine that the views are more complex than that 
CREATE VIEW view_contact AS SELECT * FROM contact 

CREATE VIEW view_companie AS SELECT * FROM companie 

SELECT co.id, 
json_build_object(
    'lastname', co.lastname, 
    'firstname', co.firstname) AS contact, 
array_agg(c.name) AS companies 
FROM view_companie AS c 
INNER JOIN companie_contact AS vs 
ON c.id = vs.id_cm 
INNER JOIN view_contact AS co 
ON co.id = vs.id_c 
GROUP BY co.id; 

更換接觸和companie我得到這個錯誤

ERROR: column "co.lastname" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: SELECT co.id,json_build_object('lastname', co.lastname, 'fi... 

我不知道爲什麼我有這樣的錯誤,我沒有找到解決我的特定問題上的Web

感謝您的幫助

PS:對不起,我的英語我法國

+0

你手頭的工作不查詢?這將有助於與錯誤結合使用,但其他人可能已根據給出的事實回答;-) – Dilettant

回答

0

你可以試試:

SELECT co.id, 
json_build_object(
    'lastname', co.lastname, 
    'firstname', co.firstname) AS contact, 
array_agg(c.name) AS companies 
FROM companie AS c 
INNER JOIN companie_contact AS vs 
ON c.id = vs.id_cm 
INNER JOIN contact AS co 
ON co.id = vs.id_c 
GROUP BY co.id, co.firstname, co.lastname,c.name ; 
+0

它可以工作,但如果我有更多字段,它將變得非常髒 –

+0

聚合函數通常需要添加GROUP BY語句。 http://www.w3schools.com/sql/sql_groupby.asp – ThiepLV

+0

如果您想將更多字段傳遞給聚合函數,那麼您必須將它們添加到group by子句中。 – ThiepLV