Asumiendo el esquema muy simple
mesa principal
main_id, ... 1 , ... 2 , ...tabla sub1
main_id, sub1_data 1 , a 1 , b 2 , gtabla sub2
main_id, sub2_data 1 , 1 2 , 1 2 , 2Como salida me gustaría
main_id, sub1_data, sub2_data 1 , a , 1 1 , b , <null> 2 , g , 1 2 , <null> , 2Usando una unión puedo acercarme pero luego cada lista obtiene sus propias filas
SELECT main_id, sub1_data, NULL FROM sub1 UNION SELECT main_id, NULL, sub2_data FROM sub2resultado
main_id, sub1_data, sub2_data 1 , a , <null> 1 , b , <null> 1 , <null> , 1 2 , g , <null> 2 , <null> , 1 2 , <null> , 2Entonces, ¿hay alguna manera de obtener dos filas compartidas y usar tantas filas como la lista más larga?
Una cosa que puede darle esta salida "intercalada" es la función unnest() con múltiples parámetros (o su equivalente: la construcción ROWS FROM(...) ) :
Las funciones de tabla también se pueden combinar usando la sintaxis
ROWS FROM, con los resultados devueltos en columnas paralelas; el número de filas de resultados en este caso es el del resultado de la función más grande, con los resultados más pequeños rellenados con valores nulos para que coincidan.
...
La función de tabla especialUNNESTse puede llamar con cualquier número de parámetros de matriz y devuelve un número correspondiente de columnas, como si se hubiera llamado aUNNESTen cada parámetro por separado y combinado usando la construcciónROWS FROM.
select main_id, sub1_data, sub2_data from (select main_id, array_agg(sub1_data) sub1_arr from sub1 group by main_id) s1 full join (select main_id, array_agg(sub2_data) sub2_arr from sub2 group by main_id) s2 using (main_id) cross join unnest(sub1_arr, sub2_arr) u(sub1_data, sub2_data)http://rextester.com/QSWESJ84203
Nota : esta es una característica "relativamente" nueva: se introdujo en 9.4