2016-06-17 2 views
2

У меня проблема с PostgreSQL 9.5 при выборе столбцов, и я использую json_build_object, у меня есть ошибка с предложением 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} 

Но когда я заменяю контакт и предприя на View или подзапроса , как показано ниже

-- 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; 

Я получил эту ошибку

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

Смежные вопросы