Один важный факт, который никто не упомянул, заключается в том, что (по крайней мере, в postgres) CTE являются заборами оптимизации:
https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/
То есть они будут обрабатываться как собственный атомарный запрос, а не как весь план запроса. Мне не хватает опыта, чтобы дать лучшее объяснение, но вы должны проверить семантику для версии SQL, которую вы используете; для опытных пользователей возможность создать забор оптимизации может повысить производительность, если вы являетесь экспертом в управлении планировщиком запросов; однако в 99% случаев вам следует избегать попыток указать планировщику запросов, что делать, потому что то, что вы думаете, будет быстрее, вероятно, хуже, чем то, что, по его мнению, будет быстрее. : -)