рдХрднреА-рдХрднреА рдПрдХ рдХрд╛рд░реНрдп SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд░реИрдЦрд┐рдХ рд╕рд░рдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдорд╛рди рдбреЗрдЯрд╛ "рдХреЙрд▓рдо рдореЗрдВ" рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднрд┐рдиреНрди рдЪрдпрди "рдЧреЛрдВрдж" рдХреЗ рд▓рд┐рдП рдЙрдарддрд╛ рд╣реИред
рдпрд╣ рдХрднреА-рдХрднреА рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
WITH T1 AS ( SELECT row_number() OVER() rn , unnest v1 FROM unnest('{1,2,3,4}'::integer[]) ) , T2 AS ( SELECT row_number() OVER() rn , unnest v2 FROM unnest('{5,6}'::integer[]) ) SELECT T1.v1 , T2.v2 FROM T1 LEFT JOIN T2 USING(rn);
v1 | v2 ------- 1 | 5 2 | 6 3 | 4 |
рдпрд╣реА рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдирдореВрдиреЗ рдореЗрдВ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЧрд┐рдиреЗ рдЧрдП, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдирдВрдмрд░ рдХреЛ рд╕реАрдЯреАрдИрдЯреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ...
[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде
рд╕рднреА рд╕рдордп рдХрд╛ рдПрдХ рдЪреМрдерд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ WindowAgg рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛!
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо PG рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ 9.4 рд╕реЗ рдХрдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ
рд╣рдо ORDINALITY рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА SRF рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ
рдмреЗрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :
WITH T1 AS ( SELECT * FROM unnest('{1,2,3,4}'::integer[]) WITH ORDINALITY T(v1, rn) ) , T2 AS ( SELECT * FROM unnest('{5,6}'::integer[]) WITH ORDINALITY T(v2, rn) ) SELECT T1.v1 , T2.v2 FROM T1 LEFT JOIN T2 USING(rn);
[Expl.t.toror.ru рдкрд░ рджреЗрдЦреЗрдВ] ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ред
рдмрд╣реБ-рддрд░реНрдХ UNNEST
рд▓реЗрдХрд┐рди рджрдХреНрд╖рддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ - рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╕рдордп рд╣рд╛рд╢ рд╡рд╛рдо рдЧрдардмрдВрдзрди рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред
рдФрд░ рд▓реЗрдЦрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗ рдХрд┐ рдкрд╣рд▓рд╛ рд╕рд░рдгреА рдмрд┐рд▓реНрдХреБрд▓ рд▓рдВрдмрд╛ рд╣реИ - рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ LEFT JOIN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдзрд╛рд░рдгрд╛ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИред
рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ 9.4:
SELECT * FROM unnest( '{1,2,3,4}'::integer[] , '{5,6}'::integer[] ) T(v1, v2);
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд╣реАрдВ рд░рд╣рд╛, рдФрд░ рдпреЛрдЬрдирд╛ рдХрд╛:
Function Scan on t (cost=0.01..1.00 rows=100 width=8) (actual time=0.006..0.007 rows=4 loops=1)
рдЗрд╕рд▓рд┐рдП, рдЧрд▓рддреА рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИред рд╣рд╛рдВ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрдВ рдХрдИ рдмрд╛рд░ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рдерд╛ - рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдкреНрд░рднрд╛рд╡ рдФрд░ рднреА рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред