Sfortunatamente, nella sintassi SQL non è prevista la dicitura "tutte le colonne tranne questa" . Puoi raggiungere il tuo obiettivo precisando l'elenco rimanente di colonne in un'espressione di tipo riga :
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
Questo è breve per la forma più esplicita: . ROW
(b.col1, b.col2, b.col3)
Tuttavia, i nomi delle colonne non vengono conservati nelle espressioni di tipo riga. In questo modo si ottengono nomi di chiavi generici nell'oggetto JSON. Vedo 3 opzioni per preservare i nomi delle colonne originali:
1. Trasmetti al tipo registrato
Trasmetti a un tipo di riga noto (registrato). Un tipo è registrato per ogni tabella o vista esistente o con un'istruzione esplicita CREATE TYPE
. È possibile utilizzare una tabella temporanea per una soluzione ad hoc (durata per la durata della sessione):
CREATE TEMP TABLE x (col1 int, col2 text, col3 date); -- use adequate data types!
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)::x) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
2. Utilizzare una sottoselezione
Utilizzare una sottoselezione per costruire una tabella derivata e fare riferimento alla tabella nel suo insieme . Questo porta anche nomi di colonne. È più dettagliato, ma non è necessario un tipo registrato:
SELECT a.id, a.name
, json_agg((SELECT x FROM (SELECT b.col1, b.col2, b.col3) AS x)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
SELECT a.id, a.name
, json_agg(json_build_object('col1', b.col1, 'col2', b.col2, 'col3', b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
Relazionato:
Simile per jsonb
con le rispettive funzioni jsonb_agg()
e jsonb_build_object()
.
Per Postgres 9.5 o versioni successive vedi anche la risposta di a_horse con una nuova variante di sintassi più breve: Postgres ha aggiunto l' operatore meno -
perjsonb
dire "tutte le chiavi tranne questa chiave" .
Poiché Postgres 10 "tranne diverse chiavi" è implementato con lo stesso operatore che prende text[]
il 2o operando, come commentato da mlt.