2016-06-17 6 views
2

カラムを選択してjson_build_objectを使用するとPostgreSQL 9.5に問題があります。私はGROUP BY句にエラーがあります。このテーブルには、このテーブルは、多対があるサブクエリを使用するとクエリに失敗する

Table companie_contact 

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

企業のテーブルです。このテーブルには、連絡先

Table companie 

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

のテーブルがある

Table contact 

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

は、私は3つのテーブルを持っています企業との連絡先をリンクするための多対多の関係(逆もまた同様)私はこのクエリを実行すると

すべて

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... 
私はこのエラーを持っている理由、私はウェブ上で私の特定の問題にあなたの助けを

おかげで、あなたの解決策を見つけられませんでしたかわからない

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

関連する問題