Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PostgreSQLВсе вопросы
PostgreSQLMiddleКодинг

Что такое CTE (WITH ...)? Чем WITH RECURSIVE отличается от обычного? Когда он нужен?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

CTE (WITH ...) даёт именованный подзапрос внутри statement; WITH RECURSIVE позволяет итеративно обходить иерархии и графы (дерево категорий, оргструктура), повторяя рекурсивную ветку до пустого результата.

Обычный WITH

-- Найти топ-10 клиентов по сумме заказов за последние 30 дней
WITH recent_orders AS (
    SELECT user_id, SUM(total) AS revenue
    FROM orders
    WHERE created_at > now() - interval '30 days'
      AND status = 'paid'
    GROUP BY user_id
)
SELECT u.email, ro.revenue
FROM recent_orders AS ro
JOIN users AS u ON u.user_id = ro.user_id
ORDER BY ro.revenue DESC
LIMIT 10;

Важно: начиная с PostgreSQL 12, нерекурсивный CTE по умолчанию не является optimization fence — планировщик может его inline-ить, если это безопасно. Для принудительного материализации используется WITH name AS MATERIALIZED (...). До PG 12 каждый CTE всегда материализовался как временный результат.

Что такое CTE (WITH ...)

CTE (Common Table Expression) — именованный подзапрос внутри одного SQL-statement, объявляемый через WITH name AS (...). Используется для структурирования сложных запросов, повторного использования промежуточного результата и рекурсивного обхода иерархий.

WITH RECURSIVE

Рекурсивный CTE состоит из двух частей, объединённых через UNION ALL:

  1. Начальная (anchor) — выбирает корневые строки.
  2. Рекурсивная — присоединяет следующий уровень, ссылаясь на само CTE.

PostgreSQL повторяет рекурсивную часть, пока она не вернёт пустой результат.

-- Обход дерева категорий (все потомки начиная от корня)
WITH RECURSIVE category_tree AS (
    -- Anchor: корневые категории
    SELECT category_id, parent_id, name, 1 AS depth,
           ARRAY[category_id] AS path
    FROM categories
    WHERE parent_id IS NULL

    UNION ALL

    -- Рекурсивная часть: потомки
    SELECT c.category_id, c.parent_id, c.name,
           ct.depth + 1,
           ct.path || c.category_id
    FROM categories AS c
    JOIN category_tree AS ct
        ON c.parent_id = ct.category_id
    WHERE NOT c.category_id = ANY(ct.path)  -- защита от циклов
)
SELECT category_id, name, depth, path
FROM category_tree
ORDER BY depth, name;
-- Найти цепочку менеджеров сотрудника (path to root)
WITH RECURSIVE manager_chain AS (
    SELECT employee_id, manager_id, name, 0 AS level
    FROM employees
    WHERE employee_id = 42

    UNION ALL

    SELECT e.employee_id, e.manager_id, e.name, mc.level + 1
    FROM employees AS e
    JOIN manager_chain AS mc ON e.employee_id = mc.manager_id
)
SELECT employee_id, name, level
FROM manager_chain
ORDER BY level;

Когда нужен WITH RECURSIVE

  • Иерархии с неизвестной глубиной: категории, оргструктура, файловая система.
  • Обход графов: зависимости пакетов, workflow state machine.
  • Построение пути: shortest path, ancestry chain.

Подводные камни

  • Рекурсия без защиты от циклов (граф с обратными рёбрами) порождает бесконечный loop и OOM — всегда добавлять WHERE NOT id = ANY(path) или CYCLE clause (PG 14+).
  • Рекурсивный CTE всегда материализуется — планировщик не может его оптимизировать совместно с внешним запросом; при большом working set появляются временные файлы.
  • CTE с MATERIALIZED (явно или до PG12) создаёт snapshot данных: изменения, сделанные после начала statement, не видны в последующих обращениях к CTE.
  • Злоупотребление CTE как «заменителем» подзапроса ради читаемости без MATERIALIZED-принуждения может дать неожиданный план после PG12, если планировщик инлайнит и меняет порядок операций.
  • Очень глубокая рекурсия (тысячи уровней) исчерпывает work_mem и уходит в tmpfile — нужен LIMIT или breadth-first подход с явной очередью.
  • UNION ALL в рекурсивной части не проверяет дубли; для дедупликации нужен UNION (но он медленнее из-за сортировки) или явная проверка через path-массив.

Частые вопросы на собеседовании

  • Что делает VACUUM, VACUUM FULL, ANALYZE? Чем они отличаются и какой когда применять?
  • Какие уровни изоляции есть и чем отличаются (READ COMMITTED, REPEATABLE READ, SERIALIZABLE)? Какой по умолчанию в Postgres?
  • Что такое PITR и чем pg_dump отличается от base backup + WAL archive?
  • Каковы типы индексов в PostgreSQL (B-tree, Hash, GIN, GiST, BRIN)?

Типичные ошибки

  • Считать CTE временной таблицей.
  • Забывать базовую и рекурсивную части.
  • Не ограничивать рекурсию в графах с циклами.

Что проверяет интервьюер

  • Просит назвать anchor и recursive member.
  • Уточняет поведение CTE в PostgreSQL 12+.
  • Проверяет пример дерева или зависимостей.

Как вы знаете этот вопрос?

Проверить себя по теме PostgreSQL →

Источники

  • https://www.postgresql.org/docs/current/queries-with.html

Связанные темы

PostgreSQLrecursive-sqlsql-querying

Вакансии с этим навыком

PostgreSQL вакансии
  • QA Manual Engineer
  • Backend Developer (Scala/ZIO)
  • Java Backend Developer
  • Fullstack QA Python
  • Linux System Administrator