Questo costruisce un valore composito anonimo:
select (1, 'a');
Ad esempio:
=> select (1, 'a');
row
-------
(1,a)
(1 row)
=> select row(1, 'a');
row
-------
(1,a)
(1 row)
Nota che si tratta di un singolo valore composto, non di più valori.
Dal bel manuale:
8.16.2. Input di valore composito
Per scrivere un valore composto come costante letterale, racchiudere i valori del campo tra parentesi e separarli con virgole. Puoi inserire virgolette intorno a qualsiasi valore di campo e devi farlo se contiene virgole o parentesi.
[...]
La ROW
la sintassi dell'espressione può essere utilizzata anche per costruire valori compositi. Nella maggior parte dei casi questo è notevolmente più semplice da usare rispetto alla sintassi stringa-letterale poiché non devi preoccuparti di più livelli di virgolette. Abbiamo già utilizzato questo metodo sopra:
ROW('fuzzy dice', 42, 1.99)
ROW('', 42, NULL)
La ROW
la parola chiave è in realtà facoltativa purché tu abbia più di un campo nell'espressione, quindi questi possono semplificare in:
('fuzzy dice', 42, 1.99)
('', 42, NULL)
I Costruttori di righe potrebbe interessare anche la sezione.
Quando dici questo:
INSERT INTO circuit (id_circuit, description, date_start, date_end, speed,
length, duration)
SELECT (...)
FROM segment seg, wgs cir where seg.id = 13077
il tuo SELECT
la clausola ha solo una colonna come l'intero (...)
espressione rappresenta un singolo valore. La soluzione è semplicemente eliminare quelle parentesi:
INSERT INTO circuit (id_circuit, description, date_start, date_end, speed, length, duration)
SELECT seg.id_segment, ..., (seg.date_end - seg.date_start)
FROM segment seg, wgs cir where seg.id = 13077