PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдзреЗрд░реИ рдЬрд╕реЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рд╡реНрдпрд╛рдЦреНрдпрд╛.tensor.ru - рд╣рд╛рдореНрд░реЛ PostgreSQL рдпреЛрдЬрдирд╛ рднрд┐рдЬреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд╕реЗрд╡рд╛ рдпрд╕рдХреЛ рдПрдХ рдорд╣рд╛рд╢рдХреНрддрд┐ рдмрд╛рд░реЗ рд╕рдЪреЗрдд рдирд╣реБрди рд╕рдХреНрдЫ - рд╕рд░реНрднрд░ рд▓рдЧ рдХреЛ рдПрдХ рд╣рд╛рд░реНрдб-рдЯреБ-рдкрдвреНрдиреЗ рдЯреБрдХреНрд░рд╛ рдмрджрд▓реНрджреИ...

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ
... рд╕рдВрдЧрдд рдпреЛрдЬрдирд╛ рдиреЛрдбреНрд╕ рдХреЛ рд▓рд╛рдЧреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрдХреЗрдд рд╕рдВрдЧ рдПрдХ рд╕реБрдиреНрджрд░ рдбрд┐рдЬрд╛рдЗрди рдХреНрд╡реЗрд░реА рдорд╛:

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ
рдЙрдирдХреЛ рджреЛрд╕реНрд░реЛ рднрд╛рдЧрдХреЛ рдпреЛ рдЯреНрд░рд╛рдиреНрд╕рдХреНрд░рд┐рдкреНрдЯрдорд╛ PGConf.Russia 2020 рдорд╛ рд░рд┐рдкреЛрд░реНрдЯ рдо рддрдкрд╛рдИрд▓рд╛рдИ рдмрддрд╛рдЙрдиреЗрдЫреБ рдХрд┐ рд╣рд╛рдореАрд▓реЗ рдпреЛ рдХрд╕рд░реА рдЧрд░реНрди рд╕рдлрд▓ рднрдпреМрдВред

рдкрд╣рд┐рд▓реЛ рднрд╛рдЧрдХреЛ рдЯреНрд░рд╛рдиреНрд╕рдХреНрд░рд┐рдкреНрдЯ, рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд░ рддрд┐рдиреАрд╣рд░реВрдХрд╛ рд╕рдорд╛рдзрд╛рдирд╣рд░реВрдорд╛ рд╕рдорд░реНрдкрд┐рдд, рд▓реЗрдЦрдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫред "рдмрд┐рд░рд╛рдореА SQL рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡реНрдпрдЮреНрдЬрдирд╣рд░реВ".



рдкрд╣рд┐рд▓реЗ, рд░рдЩ рд╕реБрд░реБ рдЧрд░реМрдВ - рд░ рд╣рд╛рдореА рдЕрдм рдпреЛрдЬрдирд╛рд▓рд╛рдИ рд░рдВрдЧ рджрд┐рдиреЗрдЫреИрдиреМрдВ, рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рд░рдВрдЧреАрди рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВ, рд╣рд╛рдореАрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдпреЛ рд╕реБрдиреНрджрд░ рд░ рдмреБрдЭреНрди рдпреЛрдЧреНрдп рдЫ, рддрд░ рдЕрдиреБрд░реЛрдзред

рдпреЛ рд╣рд╛рдореАрд▓рд╛рдИ рд▓рд╛рдЧреНрдереНрдпреЛ рдХрд┐ рдпрд╕реНрддреЛ рдЕрдирдлрд░реНрдореНрдпрд╛рдЯ "рдкрд╛рдирд╛" рд╕рдВрдЧ рд▓рдЧ рдмрд╛рдЯ рддрд╛рдирд┐рдПрдХреЛ рдЕрдиреБрд░реЛрдз рдзреЗрд░реИ рдХреБрд░реВрдк рд░ рддреНрдпрд╕реИрд▓реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреЗрдЦрд┐рдиреНрдЫред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдХреЛрдбрдорд╛ рдЕрдиреБрд░реЛрдзрдХреЛ рдореБрдЦреНрдп рднрд╛рдЧрд▓рд╛рдИ "рдЧреЛрдВрдж" рд▓рдЧрд╛рдЙрдБрдЫрдиреН (рдпреЛ, рдЕрд╡рд╢реНрдп рдкрдирд┐, рдПрдиреНрдЯрд┐рдкреНрдпрд╛рдЯрд░реНрди рд╣реЛ, рддрд░ рдпреЛ рд╣реБрдиреНрдЫ) рдПрдХ рд▓рд╛рдЗрдирдорд╛ред рднрдпрд╛рдирдХ!

рдпрд╕рд▓рд╛рдИ рдЕрдЭ рд╕реБрдиреНрджрд░ рдврдВрдЧрд▓реЗ рдЪрд┐рддреНрд░рдг рдЧрд░реМрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рд░ рдпрджрд┐ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рд╕реБрдиреНрджрд░ рдврдВрдЧрд▓реЗ рдХреЛрд░реНрди рд╕рдХреНрдЫреМрдВ, рддреНрдпреЛ рд╣реЛ, рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓ рд░ рдЕрдиреБрд░реЛрдзрдХреЛ рдореБрдЦреНрдп рднрд╛рдЧрд▓рд╛рдИ рд╕рдБрдЧреИ рд░рд╛рдЦреНрди, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдпрд╕ рдЕрдиреБрд░реЛрдзрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБрдорд╛ рд╕рдВрдХреЗрдд "рд╕рдВрд▓рдЧреНрди" рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ - рдпреЛрдЬрдирд╛рдХреЛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдмрд┐рдиреНрджреБрдорд╛ рдХреЗ рднрдпреЛред

рдХреНрд╡реЗрд░реА рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд░реВрдЦ

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдЕрдиреБрд░реЛрдз рдкрд╣рд┐рд▓реЗ рдкрд╛рд░реНрд╕ рдЧрд░реНрдиреБрдкрд░реНрдЫред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд╕рдБрдЧ рдЫ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдХреЛрд░ NodeJS рдорд╛ рдЪрд▓реНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореАрд▓реЗ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдореЛрдбреНрдпреБрд▓ рдмрдирд╛рдпреМрдВ, рддрдкрд╛рдИрдВ рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ GitHub рдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреБрд╣реЛрд╕реНред рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпреА PostgreSQL рдкрд╛рд░реНрд╕рд░рдХреЛ рдЖрдиреНрддрд░рд┐рдХрд╣рд░реВрдорд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд "рдмрд╛рдЗрдиреНрдбрд┐рдЩрд╣рд░реВ" рд╣реБрдиреНред рддреНрдпреЛ рд╣реЛ, рд╡реНрдпрд╛рдХрд░рдг рдХреЗрд╡рд▓ рдмрд╛рдЗрдирд░реА рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рдпрд╕рдорд╛ NodeJS рдмрд╛рдЯ рдмрд╛рдЗрдиреНрдбрд┐рдЩрд╣рд░реВ рдмрдирд╛рдЗрдиреНрдЫред рд╣рд╛рдореАрд▓реЗ рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐рдХреЛ рдореЛрдбреНрдпреБрд▓рд▓рд╛рдИ рдЖрдзрд╛рд░рдХреЛ рд░реВрдкрдорд╛ рд▓рд┐рдпреМрдВ - рдпрд╣рд╛рдБ рдХреБрдиреИ рдареВрд▓реЛ рдЧреЛрдкреНрдп рдЫреИрдиред

рд╣рд╛рдореАрд▓реЗ рдЕрдиреБрд░реЛрдзрдХреЛ рдореБрдЦреНрдп рднрд╛рдЧрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдЗрдирдкреБрдЯрдХреЛ рд░реВрдкрдорд╛ рдлрд┐рдб рдЧрд░реНрдЫреМрдВ - рдЖрдЙрдЯрдкреБрдЯрдорд╛ рд╣рд╛рдореАрд▓реЗ JSON рд╡рд╕реНрддреБрдХреЛ рд░реВрдкрдорд╛ рдкрд╛рд░реНрд╕ рдЧрд░рд┐рдПрдХреЛ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд░реВрдЦ рдкрд╛рдЙрдБрдЫреМрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдЕрдм рд╣рд╛рдореА рдпрд╕ рд░реВрдЦрдХреЛ рдорд╛рдзреНрдпрдордмрд╛рдЯ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдорд╛ рджреМрдбрди рд╕рдХреНрдЫреМрдВ рд░ рд╣рд╛рдореАрд▓реЗ рдЪрд╛рд╣реЗрдХреЛ рдЗрдиреНрдбреЗрдиреНрдЯ, рд░рдЩ рд░ рдврд╛рдБрдЪрд╛рдХреЛ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рднреЗрд▓рд╛ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рд╣реЛрдЗрди, рдпреЛ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдЫреИрди, рддрд░ рдпреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реБрдиреЗрдЫ рдХрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рд▓рд╛рдЧреНрдереНрдпреЛред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдореНрдпрд╛рдкрд┐рдЩ рдХреНрд╡реЗрд░реА рд░ рдпреЛрдЬрдирд╛ рдиреЛрдбрд╣рд░реВ

рдЕрдм рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЛ рдЪрд░рдгрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реЗрдХреЛ рдпреЛрдЬрдирд╛ рд░ рджреЛрд╕реНрд░реЛ рдЪрд░рдгрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реЗрдХреЛ рдкреНрд░рд╢реНрдирд▓рд╛рдИ рдХрд╕рд░реА рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд╣реЗрд░реМрдВред

рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдФрдВ - рд╣рд╛рдореАрд╕рдБрдЧ рдПрдЙрдЯрд╛ рдкреНрд░рд╢реНрди рдЫ рдЬрд╕рд▓реЗ CTE рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫ рд░ рддреНрдпрд╕рдмрд╛рдЯ рджреБрдИ рдкрдЯрдХ рдкрдвреНрдЫред рдЙрд╕рд▓реЗ рдпрд╕реНрддреЛ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдБрдЫред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

CTE

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдзреНрдпрд╛рдирдкреВрд░реНрд╡рдХ рд╣реЗрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рд╕рдВрд╕реНрдХрд░рдг 12 рд╕рдореНрдо (рд╡рд╛ рдХреБрдЮреНрдЬреА рд╢рдмреНрджрдХреЛ рд╕рд╛рде рд╕реБрд░реВ рдЧрд░реНрджреИ MATERIALIZED) рдЧрдарди CTE рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреА рдПрдХ рдирд┐рд░рдкреЗрдХреНрд╖ рдмрд╛рдзрд╛ рд╣реЛ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд┐ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдЕрдиреБрд░реЛрдзрдорд╛ рдХрддреИ CTE рдкреБрд╕реНрддрд╛ рд░ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдХрддреИ рдиреЛрдб рджреЗрдЦреНрдпреМрдВ CTE, рддреНрдпрд╕рдкрдЫрд┐ рдпреА рдиреЛрдбрд╣рд░реВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ "рд▓рдбрд╛рдЗрдБ" рд╣реБрдиреНрдЫрдиреН, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рддреБрд░реБрдиреНрддреИ рдЬреЛрдбреНрди рд╕рдХреНрдЫреМрдВред

рддрд╛рд░рд╛ рдЪрд┐рдиреНрд╣рдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛: CTEs рдиреЗрд╕реНрдЯ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ
рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдХрдордЬреЛрд░ рдиреЗрд╕реНрдЯреЗрдбрд╣рд░реВ рдЫрдиреН, рд░ рдПрдЙрдЯреИ рдирд╛рдордХрд╛ рдкрдирд┐ред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВ рднрд┐рддреНрд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ CTE A рдмрдирд╛рдЙрди CTE X, рд░ рднрд┐рддреНрд░ рд╕рдорд╛рди рд╕реНрддрд░ рдорд╛ CTE B рдлреЗрд░рд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН CTE X:

WITH A AS (
  WITH X AS (...)
  SELECT ...
)
, B AS (
  WITH X AS (...)
  SELECT ...
)
...

рддреБрд▓рдирд╛ рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдмреБрдЭреНрдиреБрдкрд░реНрдЫред рдпреЛ "рдЖрдБрдЦрд╛рд▓реЗ" рдмреБрдЭреНрди - рдпреЛрдЬрдирд╛ рд╣реЗрд░реЗрд░, рдЕрдиреБрд░реЛрдзрдХреЛ рд╢рд░реАрд░ рдкрдирд┐ рд╣реЗрд░реНрди - рдзреЗрд░реИ рдЧрд╛рд╣реНрд░реЛ рдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрдХреЛ CTE рдкреБрд╕реНрддрд╛ рдЬрдЯрд┐рд▓ рдЫ, рдиреЗрд╕реНрдЯреЗрдб рдЫ, рд░ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдареВрд▓реЛ рдЫрдиреН, рддрдм рдпреЛ рдкреВрд░реНрдгрддрдпрд╛ рдмреЗрд╣реЛрд╢ рдЫред

рдпреВрдирд┐рдпрди

рдпрджрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдкреНрд░рд╢реНрдирдорд╛ рдХреБрдЮреНрдЬреА рд╢рдмреНрдж рдЫ рднрдиреЗ UNION [ALL] (рджреБрдИ рдирдореВрдирд╛рд╣рд░реВ рдЬреЛрдбреНрдиреЗ рдЕрдкрд░реЗрдЯрд░), рддреНрдпрд╕рдкрдЫрд┐ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдпреЛ рдиреЛрдбрд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫ Append, рд╡рд╛ рдХреЗрд╣рд┐ Recursive Union.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдЬреБрди рдорд╛рдерд┐ "рдорд╛рдерд┐" рдЫ UNION - рдпреЛ рд╣рд╛рдореНрд░реЛ рдиреЛрдбрдХреЛ рдкрд╣рд┐рд▓реЛ рд╡рдВрд╢рдЬ рд╣реЛ, рдЬреБрди "рддрд▓" - рджреЛрд╕реНрд░реЛ рд╣реЛред рдпрджрд┐ рдорд╛рд░реНрдлрдд UNION рд╣рд╛рдореАрд╕рдБрдЧ рдПрдХреИрдЪреЛрдЯрд┐ рдзреЗрд░реИ рдмреНрд▓рдХрд╣рд░реВ "рдЧреНрд▓реБрдб" рдЫрдиреН, рддреНрдпрд╕рдкрдЫрд┐ Append-рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдиреЛрдб рд╣реБрдиреЗрдЫ, рддрд░ рдпрд╕рдорд╛ рджреБрдИ рд╣реЛрдЗрди, рддрд░ рдзреЗрд░реИ рдмрдЪреНрдЪрд╛рд╣рд░реВ рд╣реБрдиреЗрдЫрдиреН - рдХреНрд░рдорд╢рдГ рддрд┐рдиреАрд╣рд░реВ рдЬрд╛рдиреЗ рдХреНрд░рдордорд╛:

  (...) -- #1
UNION ALL
  (...) -- #2
UNION ALL
  (...) -- #3

Append
  -> ... #1
  -> ... #2
  -> ... #3

рддрд╛рд░рд╛ рдЪрд┐рдиреНрд╣рдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛: рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирдореВрдирд╛ рдЙрддреНрдкрд╛рджрди рднрд┐рддреНрд░ (WITH RECURSIVE) рдкрдирд┐ рдПрдХ рднрдиреНрджрд╛ рдмрдвреА рд╣реБрди рд╕рдХреНрдЫ UNIONред рддрд░ рдЕрдиреНрддрд┐рдо рдПрдХ рдкрдЫрд┐рдХреЛ рдЕрдиреНрддрд┐рдо рдмреНрд▓рдХ рд╕рдзреИрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реБрдиреНрдЫ UNIONред рдорд╛рдерд┐рдХрд╛ рд╕рдмреИ рдХреБрд░рд╛ рдПрдЙрдЯреИ рдЫрдиреН, рддрд░ рдлрд░рдХ рдЫрдиреН UNION:

WITH RECURSIVE T AS(
  (...) -- #1
UNION ALL
  (...) -- #2, ╤В╤Г╤В ╨║╨╛╨╜╤З╨░╨╡╤В╤Б╤П ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╤П ╤Б╤В╨░╤А╤В╨╛╨▓╨╛╨│╨╛ ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╤П ╤А╨╡╨║╤Г╤А╤Б╨╕╨╕
UNION ALL
  (...) -- #3, ╤В╨╛╨╗╤М╨║╨╛ ╤Н╤В╨╛╤В ╨▒╨╗╨╛╨║ ╤А╨╡╨║╤Г╤А╤Б╨╕╨▓╨╜╤Л╨╣ ╨╕ ╨╝╨╛╨╢╨╡╤В ╤Б╨╛╨┤╨╡╤А╨╢╨░╤В╤М ╨╛╨▒╤А╨░╤Й╨╡╨╜╨╕╨╡ ╨║ T
)
...

рддрдкрд╛рдИрдВ рдкрдирд┐ рддреНрдпрд╕реНрддрд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ "рд╕реНрдЯрд┐рдХ рдЖрдЙрдЯ" рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рд╣рд╛рдореА рджреЗрдЦреНрдЫреМрдВ UNION-рд╣рд╛рдореНрд░реЛ рдЕрдиреБрд░реЛрдзрдорд╛ 3 рдЦрдгреНрдбрд╣рд░реВ рдерд┐рдПред рддрджрдиреБрд╕рд╛рд░, рдПрдХ UNION рдпрд╕рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫ Append-рдиреЛрдб, рд░ рдЕрд░реНрдХреЛрдорд╛ - Recursive Union.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдкрдвреНрдиреЗ-рд▓реЗрдЦреНрдиреЗ рдбрд╛рдЯрд╛

рд╕рдмреИ рдХреБрд░рд╛ рд░рд╛рдЦрд┐рдПрдХреЛ рдЫ, рдЕрдм рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдЕрдиреБрд░реЛрдзрдХреЛ рдХреБрди рдЯреБрдХреНрд░рд╛ рдпреЛрдЬрдирд╛рдХреЛ рдХреБрди рдЯреБрдХреНрд░рд╛рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫред рд░ рдпреА рдЯреБрдХреНрд░рд╛рд╣рд░реВрдорд╛ рд╣рд╛рдореА рд╕рдЬрд┐рд▓реИ рд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдкрдорд╛ рддреА рд╡рд╕реНрддреБрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдЫреМрдВ рдЬреБрди "рдкрдвреНрди рдпреЛрдЧреНрдп" рдЫрдиреНред

рдХреНрд╡реЗрд░реАрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫреИрди рдХрд┐ рдпреЛ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛ рд╡рд╛ CTE, рддрд░ рддрд┐рдиреАрд╣рд░реВ рдПрдЙрдЯреИ рдиреЛрдбрджреНрд╡рд╛рд░рд╛ рддреЛрдХрд┐рдПрдХрд╛ рдЫрдиреНред RangeVarред рд░ "рдкрдардиреАрдпрддрд╛" рдХреЛ рд╕рд░реНрддрдорд╛, рдпреЛ рдиреЛрдбрд╣рд░реВрдХреЛ рдПрдХрджрдо рд╕реАрдорд┐рдд рд╕реЗрдЯ рдкрдирд┐ рд╣реЛ:

  • Seq Scan on [tbl]
  • Bitmap Heap Scan on [tbl]
  • Index [Only] Scan [Backward] using [idx] on [tbl]
  • CTE Scan on [cte]
  • Insert/Update/Delete on [tbl]

рд╣рд╛рдореАрд▓рд╛рдИ рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реАрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдерд╛рд╣рд╛ рдЫ, рд╣рд╛рдореАрд▓рд╛рдИ рдмреНрд▓рдХрд╣рд░реВрдХреЛ рдкрддреНрд░рд╛рдЪрд╛рд░ рдерд╛рд╣рд╛ рдЫ, рд╣рд╛рдореАрд▓рд╛рдИ рд╡рд╕реНрддреБрд╣рд░реВрдХреЛ рдирд╛рдо рдерд╛рд╣рд╛ рдЫ - рд╣рд╛рдореА рдПрдХ-рджреЗрдЦрд┐-рдПрдХ рддреБрд▓рдирд╛ рдЧрд░реНрдЫреМрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдлреЗрд░рд┐ рдХрд╛рд░реНрдп "рдПрд╕реНрдЯреЗрд░рд┐рд╕реНрдХ рд╕рдВрдЧ"ред рд╣рд╛рдореА рдЕрдиреБрд░реЛрдз рд▓рд┐рдиреНрдЫреМрдВ, рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдЫреМрдВ, рд╣рд╛рдореАрд╕рдБрдЧ рдХреБрдиреИ рдЙрдкрдирд╛рдо рдЫреИрди - рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдПрдЙрдЯреИ CTE рдмрд╛рдЯ рджреБрдИ рдкрдЯрдХ рдкрдвреНрдЫреМрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рд╣рд╛рдореА рдпреЛрдЬрдирд╛ рд╣реЗрд░реНрдЫреМрдВ - рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЫ? рд╣рд╛рдореАрд╕рдБрдЧ рдЙрдкрдирд╛рдо рдХрд┐рди рдерд┐рдпреЛ? рд╣рд╛рдореАрд▓реЗ рдЕрд░реНрдбрд░ рдЧрд░реЗрдХрд╛ рдЫреИрдиреМрдВред рдЙрд╕рд▓реЗ рдпрд╕реНрддреЛ "рдирдореНрдмрд░ рдирдореНрдмрд░" рдХрд╣рд╛рдБ рдкрд╛рдЙрдБрдЫ?

PostgreSQL рд▓реЗ рдпрд╕рд▓рд╛рдИ рдЖрдлреИрдВ рдердкреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рддреНрд░ рдпреЛ рдмреБрдЭреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХреЗрд╡рд▓ рдпрд╕реНрддреЛ рдЙрдкрдирд╛рдо рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐, рдпреЛрдЬрдирд╛рд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдиреЗ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╕рд▓реЗ рдХреБрдиреИ рдЕрд░реНрде рд░рд╛рдЦреНрджреИрди, рдпреЛ рдпрд╣рд╛рдБ рдердкрд┐рдПрдХреЛ рдЫред рдЙрд╣рд╛рдБрд▓рд╛рдИ рдзреНрдпрд╛рди рдирджрд┐рдФрдВред

рджреЛрд╕реНрд░реЛ рдХрд╛рд░реНрдп "рдПрд╕реНрдЯреЗрд░рд┐рд╕реНрдХ рд╕рдВрдЧ": рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рд╡рд┐рднрд╛рдЬрди рдЧрд░рд┐рдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛рдмрд╛рдЯ рдкрдврд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рдиреЛрдб рдкрд╛рдЙрдиреЗрдЫреМрдВ Append рд╡рд╛ Merge Append, рдЬрд╕рдорд╛ "рдмрдЪреНрдЪрд╛рд╣рд░реВ" рдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреЗрдЫ, рд░ рдЬрд╕рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рд╣реБрдиреЗрдЫ Scanрддрд╛рд▓рд┐рдХрд╛-рдЦрдгреНрдбрдмрд╛рдЯ рдУрдо: Seq Scan, Bitmap Heap Scan рд╡рд╛ Index Scanред рддрд░, рдХреБрдиреИ рдкрдирд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдпреА "рдмрдЪреНрдЪрд╛рд╣рд░реВ" рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдирд╣рд░реВ рд╣реБрдиреЗрдЫреИрдирдиреН - рдпрд╕рд░реА рдпреА рдиреЛрдбрд╣рд░реВрдмрд╛рдЯ рдЫреБрдЯреНрдпрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред Append рдорд╛ UNION.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рд╣рд╛рдореА рддреНрдпрд╕реНрддрд╛ рдЧрд╛рдБрдард╣рд░реВ рдкрдирд┐ рдмреБрдЭреНрдЫреМрдВ, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ "рдПрдЙрдЯреИ рдереБрдкреНрд░реЛрдорд╛" рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдЫреМрдВ рд░ рднрдиреНрдЫреМрдВ: "рддрдкрд╛рдИрдВрд▓реЗ megatable рдмрд╛рдЯ рдкрдвреНрдиреБрднрдПрдХреЛ рд╕рдмреИ рдХреБрд░рд╛ рдпрд╣рд╛рдБ рд░ рд░реВрдЦрдХреЛ рддрд▓ рдЫ".

"рд╕рд░рд▓" рдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдиреЛрдбрд╣рд░реВ

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

Values Scan рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдореЗрд▓ рдЦрд╛рдиреНрдЫ VALUES рдЕрдиреБрд░реЛрдз рдорд╛ред

Result рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдз рдЫ FROM рдХреНрд░рдордмрджреНрдз рдЧрд░реНрдиреБрд╣реЛрд╕реН SELECT 1ред рд╡рд╛ рдЬрдм рддрдкрд╛рдИрдВрд╕рдБрдЧ рдЬрд╛рдирд╛рдЬрд╛рдиреА рдЧрд▓рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЫ WHERE-block (рддреНрдпрд╕рдкрдЫрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЗрдЦрд┐рдиреНрдЫ One-Time Filter):

EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- ╨╕╨╗╨╕ 0 = 1

Result  (cost=0.00..0.00 rows=0 width=230) (actual time=0.000..0.000 rows=0 loops=1)
  One-Time Filter: false

Function Scan рдЙрд╣реА рдирд╛рдордХреЛ SRF рд▓рд╛рдИ "рдирдХреНрд╕рд╛"ред

рддрд░ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рд╕рд╛рде рд╕рдмреИ рдХреБрд░рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЫ - рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рддрд┐рдиреАрд╣рд░реВ рд╕рдзреИрдВ рдорд╛ рдмрджрд▓реНрджреИрдирдиреН InitPlan/SubPlanред рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рддрд┐рдиреАрд╣рд░реВрдорд╛ рдкрд░рд┐рдгрдд рд╣реБрдиреНрдЫрдиреН ... Join рд╡рд╛ ... Anti Join, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм рддрдкрд╛рдЗрдБ рдХреЗрд╣рд┐ рд▓реЗрдЦреНрдиреБрд╣реБрдиреНрдЫ WHERE NOT EXISTS ...ред рд░ рдпрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рд╕рдзреИрдВ рд╕рдореНрднрд╡ рдЫреИрди - рдпреЛрдЬрдирд╛рдХреЛ рдкрд╛рдардорд╛ рдпреЛрдЬрдирд╛рдХреЛ рдиреЛрдбрд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХреБрдиреИ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВ рдЫреИрдирдиреНред

рдлреЗрд░рд┐ рдХрд╛рд░реНрдп "рдПрд╕реНрдЯреЗрд░рд┐рд╕реНрдХ рд╕рдВрдЧ": рдХреЗрд╣реА VALUES рдЕрдиреБрд░реЛрдз рдорд╛ред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд░ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрддрдкрд╛рдИрд▓реЗ рдзреЗрд░реИ рдиреЛрдбрд╣рд░реВ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ Values Scan.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

"рдЧрдиреНрддреА" рдкреНрд░рддреНрдпрдпрд╣рд░реВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдПрдХрдЕрд░реНрдХрд╛рдмрд╛рдЯ рдЫреБрдЯреНрдпрд╛рдЙрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫ - рддрд┐рдиреАрд╣рд░реВ рдареНрдпрд╛рдХреНрдХреИ рдХреНрд░рдордмрджреНрдз рд░реВрдкрдорд╛ рдердкрд┐рдПрдХрд╛ рдЫрдиреН рдЬрд╕рдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рддрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд░реНрдЫрдиреНред VALUES- рдорд╛рдерд┐ рджреЗрдЦрд┐ рддрд▓ рд╕рдореНрдо рдЕрдиреБрд░реЛрдз рд╕рдВрдЧ рдмреНрд▓рдХред

рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ

рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрд░реЛрдзрдорд╛ рд╕рдмреИ рдХреБрд░рд╛ рдорд┐рд▓рд╛рдЗрдПрдХреЛ рдЫ - рд╕рдмреИ рдмрд╛рдБрдХреА рдЫ Limit.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рддрд░ рдпрд╣рд╛рдБ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд░рд▓ рдЫ - рдЬрд╕реНрддреИ рдиреЛрдбрд╣рд░реВ Limit, Sort, Aggregate, WindowAgg, Unique "рдирдХреНрд╕рд╛" рдЕрдиреБрд░реЛрдзрдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрд▓рд╛рдИ рдПрдХ-рджреЗрдЦрд┐-рдПрдХ, рдпрджрд┐ рддрд┐рдиреАрд╣рд░реВ рддреНрдпрд╣рд╛рдБ рдЫрдиреНред рдпрд╣рд╛рдБ рдХреБрдиреИ "рддрд╛рд░рд╛рд╣рд░реВ" рд╡рд╛ рдХрдард┐рдирд╛рдЗрд╣рд░реВ рдЫреИрдирдиреНред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рд╢рд╛рдорд┐рд▓

рдЬрдм рд╣рд╛рдореА рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рдХрдард┐рдирд╛рдЗрд╣рд░реВ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН JOIN рдЖрдкрд╕рдорд╛ред рдпреЛ рд╕рдзреИрдВ рд╕рдореНрднрд╡ рдЫреИрди, рддрд░ рдпреЛ рд╕рдореНрднрд╡ рдЫред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдХреНрд╡реЗрд░реА рдкрд╛рд░реНрд╕рд░рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рд╣рд╛рдореАрд╕рдБрдЧ рдиреЛрдб рдЫ JoinExpr, рдЬрд╕рдХреЛ рдареАрдХ рджреБрдИ рдмрдЪреНрдЪрд╛рд╣рд░реВ рдЫрдиреН - рдмрд╛рдпрд╛рдБ рд░ рджрд╛рдпрд╛рдБред рдпреЛ, рддрджрдиреБрд╕рд╛рд░, рддрдкрд╛рдИрдХреЛ JOIN рдХреЛ "рдорд╛рдерд┐" рдХреЗ рдЫ рд░ рдЕрдиреБрд░реЛрдзрдорд╛ "рддрд▓" рд▓реЗрдЦрд┐рдПрдХреЛ рдЫред

рд░ рдпреЛрдЬрдирд╛ рдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрд┐, рдпреА рдХреЗрд╣рд┐ рдХреЛ рджреБрдИ рд╕рдиреНрддрд╛рди рд╣реЛ * Loop/* Join-рдиреЛрдбред Nested Loop, Hash Anti Join,... - рддреНрдпрд╕реНрддреИ рдХреЗрд╣реА рдХреБрд░рд╛ред

рд╕рд░рд▓ рддрд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ: рдпрджрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдПрдХ рдЕрд░реНрдХрд╛рдорд╛ "рд╕рд╛рдореЗрд▓" рд╣реБрдиреЗ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ A рд░ B рдЫрдиреН рднрдиреЗ, рдЕрдиреБрд░реЛрдзрдорд╛ рддрд┐рдиреАрд╣рд░реВ рдпрд╛ рдд рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрди рд╕рдХреНрдЫрдиреНред A-JOIN-B, рд╡рд╛ B-JOIN-Aред рдпрд╕рд░реА рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ, рдЕрд░реНрдХреЛ рддрд░рд┐рдХрд╛рд▓реЗ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ, рд░ рддреНрдпрд╕реНрддрд╛ рдЬреЛрдбреАрд╣рд░реВ рдирд╣рдЯреЗрд╕рдореНрдоред

рд╣рд╛рдореНрд░реЛ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд░реВрдЦ рд▓рд┐рдиреБрд╣реЛрд╕реН, рд╣рд╛рдореНрд░реЛ рдпреЛрдЬрдирд╛ рд▓рд┐рдиреБрд╣реЛрд╕реН, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН ... рд╕рдорд╛рди рдЫреИрди!
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдпрд╕рд▓рд╛рдИ рдЧреНрд░рд╛рдлрдХреЛ рд░реВрдкрдорд╛ рдкреБрди: рдХреЛрд░реМрдВ - рдУрд╣, рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдХреЗрд╣рд┐ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ!
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдиреЛрдбрд╣рд░реВ рдЫрдиреН рдЬреБрди рдПрдХреИ рд╕рд╛рде рдмрдЪреНрдЪрд╛рд╣рд░реВ B рд░ C рдЫрдиреН - рд╣рд╛рдореА рдХреБрди рдХреНрд░рдордорд╛ рд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрджреИрдиреМрдВред рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдВрдпреЛрдЬрди рдЧрд░реМрдВ рд░ рдиреЛрдбрдХреЛ рдЪрд┐рддреНрд░рд▓рд╛рдИ рдШреБрдорд╛рдЙрдиреБрд╣реЛрд╕реНред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдлреЗрд░рд┐ рд╣реЗрд░реМрдВред рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рдмрдЪреНрдЪрд╛рд╣рд░реВ A рд░ рдЬреЛрдбреАрд╣рд░реВ (B + C) рд╕рдБрдЧ рдиреЛрдбрд╣рд░реВ рдЫрдиреН - рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рдкрдирд┐ рдЙрдкрдпреБрдХреНрддред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдорд╣рд╛рди! рд╣рд╛рдореА рдпреА рджреБрдИ рд╣реМрдВ рднрдиреНрдиреЗ рдерд╛рд╣рд╛ рднрдпреЛ JOIN рдЕрдиреБрд░реЛрдзрдмрд╛рдЯ рдпреЛрдЬрдирд╛ рдиреЛрдбрд╣рд░реВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬреЛрдбрд┐рдПрдХрд╛ рдерд┐рдПред

рдЕрдлрд╕реЛрд╕, рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдзреИрдВ рд╕рдорд╛рдзрд╛рди рд╣реБрдБрджреИрдиред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдорд╛ A JOIN B JOIN C, рд░ рдпреЛрдЬрдирд╛рдорд╛, рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, "рдмрд╛рд╣реНрдп" рдиреЛрдбрд╣рд░реВ A рд░ C рдЬреЛрдбрд┐рдПрдХрд╛ рдерд┐рдПред рддрд░ рдЕрдиреБрд░реЛрдзрдорд╛ рддреНрдпрд╕реНрддреЛ рдХреБрдиреИ рдЕрдкрд░реЗрдЯрд░ рдЫреИрди, рд╣рд╛рдореАрд╕рдБрдЧ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреЗрд╣рд┐ рдЫреИрди, рд╕рдВрдХреЗрдд рд╕рдВрд▓рдЧреНрди рдЧрд░реНрди рдХреЗрд╣рд┐ рдЫреИрдиред рддрдкрд╛рдИрд▓реЗ рд▓реЗрдЦреНрджрд╛ "рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо" рдХреЛ рд╕рд╛рде рд╕рдорд╛рди рдЫ A, B.

рддрд░, рдзреЗрд░реИ рдЬрд╕реЛ рдХреЗрд╕рд╣рд░реВрдорд╛, рд▓рдЧрднрдЧ рд╕рдмреИ рдиреЛрдбрд╣рд░реВ "рдЕрдирдЯрд╛рдЗрдб" рд╣реБрди рд╕рдХреНрдЫрдиреН рд░ рддрдкрд╛рдИрд▓реЗ рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдЩ рд╕рдордпрдореИ рдмрд╛рдБрдпрд╛рдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ - рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдкрдорд╛, рдЧреБрдЧрд▓ рдХреНрд░реЛрдордорд╛ рдЬрдм рддрдкрд╛рдЗрдБ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрди рд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдердирд▓рд╛рдИ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдЧрд░реНрди рдХрддрд┐ рд▓рд╛рдореЛ рд╕рдордп рд▓рд╛рдЧреЗрдХреЛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рд░ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдпреЛ рд╕рдмреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдпреЛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдЙрди рдХреЛ рд▓рд╛рдЧреА, рд╣рд╛рдореАрд▓реЗ рднрдгреНрдбрд╛рд░рдг рдмрдирд╛рдПрдХрд╛ рдЫреМрдВ рдЕрднрд┐рд▓реЗрдЦ, рдЬрд╣рд╛рдБ рддрдкрд╛рдИрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рдкрдЫрд┐ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд╕рд╣рд┐рдд рдЖрдлреНрдиреЛ рдпреЛрдЬрдирд╛рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╡рд╛ рдХрд╕реИрд╕рдБрдЧ рд▓рд┐рдЩреНрдХ рд╕рд╛рдЭрд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдпрджрд┐ рддрдкрд╛рдЗрдБ рднрд░реНрдЦрд░реИ рдкрдвреНрди рдирд╕рдХрд┐рдиреЗ рдкреНрд░рд╢реНрдирд▓рд╛рдИ рдкрд░реНрдпрд╛рдкреНрдд рдлрд╛рд░рдордорд╛ рд▓реНрдпрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╣рд╛рдореНрд░реЛ "рд╕рд╛рдорд╛рдиреНрдпрдХрд░реНрддрд╛".

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рд░ рдХреНрд╡реЗрд░реА рдХрд╕рд░реА рдорд┐рд▓рд╛рдЙрдиреЗ

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди