{"id":845,"date":"2026-06-01T10:00:36","date_gmt":"2026-06-01T13:00:36","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/06\/01\/aula-11-ctes-with-queries-e-with-recursive-no-postgresql\/"},"modified":"2026-06-01T10:00:36","modified_gmt":"2026-06-01T13:00:36","slug":"aula-11-ctes-with-queries-e-with-recursive-no-postgresql","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/06\/01\/aula-11-ctes-with-queries-e-with-recursive-no-postgresql\/","title":{"rendered":"Aula 11: CTEs \u2014 WITH queries e WITH RECURSIVE no PostgreSQL"},"content":{"rendered":"<p>Nesta aula, vamos explorar um recurso essencial no PostgreSQL conhecido como CTEs (Common Table Expressions). Vamos entender como as CTEs podem ser utilizadas para tornar suas consultas mais leg\u00edveis e eficientes, especialmente em cen\u00e1rios complexos. Entender o uso de CTEs \u00e9 crucial para qualquer profissional que pretenda se aprimorar no uso do PostgreSQL.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>Entender o que s\u00e3o CTEs e como elas funcionam no PostgreSQL<\/li>\n<li>Aprender a escrever consultas com <strong>WITH<\/strong> queries<\/li>\n<li>Explorar o uso de <strong>WITH RECURSIVE<\/strong> para criar consultas recursivas<\/li>\n<li>Examinar casos pr\u00e1ticos de uso de CTEs para resolver problemas complexos<\/li>\n<\/ul>\n<h3>Introdu\u00e7\u00e3o \u00e0s CTEs no PostgreSQL<\/h3>\n<p>As Common Table Expressions, ou CTEs, s\u00e3o uma forma poderosa de estruturar consultas SQL de forma mais clara e organizada. No PostgreSQL, as CTEs s\u00e3o definidas usando a cl\u00e1usula <strong>WITH<\/strong>. Elas permitem dividir uma consulta em partes menores e mais f\u00e1ceis de entender, especialmente \u00fatil quando lidamos com v\u00e1rias subconsultas.<\/p>\n<h3>Pr\u00e1tica com CTEs: Criando Consultas com <strong>WITH<\/strong><\/h3>\n<p>Para come\u00e7ar a utilizar CTEs, vamos explorar um exemplo simples onde usamos a cl\u00e1usula <strong>WITH<\/strong> para calcular o total de vendas de um produto espec\u00edfico em nosso sistema.<\/p>\n<pre><code>WITH sales_by_product AS (\n  SELECT product_id, SUM(amount) AS total_sales\n  FROM sales\n  GROUP BY product_id\n)\nSELECT products.name, sales_by_product.total_sales\nFROM sales_by_product\nJOIN products ON sales_by_product.product_id = products.id\nWHERE products.name = 'Produto X';<\/code><\/pre>\n<p>Neste exemplo, uma subconsulta \u00e9 definida no CTE <strong>sales_by_product<\/strong>, que calcula as vendas totais por produto. A consulta principal ent\u00e3o utiliza essa tabela tempor\u00e1ria para retornar o nome do produto e seu total de vendas. Esse m\u00e9todo torna o SQL mais f\u00e1cil de ler e mant\u00e9m a l\u00f3gica da subconsulta separada.<\/p>\n<h3>Explorando <strong>WITH RECURSIVE<\/strong> para consultas recursivas<\/h3>\n<p>O PostgreSQL tamb\u00e9m suporta CTEs recursivas atrav\u00e9s do uso de <strong>WITH RECURSIVE<\/strong>. Esse tipo de CTE \u00e9 \u00fatil para resolver problemas em que uma hierarquia ou rela\u00e7\u00e3o recursiva precisa ser navegada, como em estruturas de lista de tarefas ou organogramas.<\/p>\n<pre><code>WITH RECURSIVE employee_hierarchy AS (\n  SELECT employee_id, manager_id, name\n  FROM employees\n  WHERE manager_id IS NULL\n  UNION ALL\n  SELECT e.employee_id, e.manager_id, e.name\n  FROM employees e\n  JOIN employee_hierarchy eh ON eh.employee_id = e.manager_id\n)\nSELECT * FROM employee_hierarchy;<\/code><\/pre>\n<p>Neste exemplo, estamos construindo uma hierarquia de funcion\u00e1rios a partir de uma tabela chamada <strong>employees<\/strong>. Primeiramente, selecionamos todos os funcion\u00e1rios sem um gerente (o in\u00edcio da recurs\u00e3o). Em seguida, utilizamos uma <strong>UNION ALL<\/strong> para continuar a consulta unindo os funcion\u00e1rios ao seu gerente, criando assim a hierarquia.<\/p>\n<h3>Vantagens de usar CTEs em consultas avan\u00e7adas<\/h3>\n<p>As CTEs s\u00e3o extremamente \u00fateis em situa\u00e7\u00f5es onde voc\u00ea precisa de:<\/p>\n<ul>\n<li>Dividir consultas complexas em partes gerenci\u00e1veis e mais f\u00e1ceis de entender<\/li>\n<li>Evitar a repeti\u00e7\u00e3o de l\u00f3gica ao reusar resultados intermedi\u00e1rios em v\u00e1rias partes da consulta<\/li>\n<li>Substituir subconsultas nomeadas, melhorando a legibilidade<\/li>\n<\/ul>\n<p>Em nossos projetos na <strong>JRT Technology Solutions<\/strong>, utilizamos CTEs para otimizar a estrutura de consultas complexas e melhorar a performance de sistemas legados.<\/p>\n<h3>Resumo da Aula 11<\/h3>\n<p>Hoje, aprendemos a utilizar CTEs no PostgreSQL para estruturar melhor nossas consultas, principalmente em cen\u00e1rios complexos. Exploramos exemplos pr\u00e1ticos usando <strong>WITH<\/strong> e <strong>WITH RECURSIVE<\/strong> e discutimos as vantagens das CTEs em rela\u00e7\u00e3o a outras estruturas de consultas. Na pr\u00f3xima aula, vamos mergulhar na otimiza\u00e7\u00e3o de consultas no PostgreSQL, abordando \u00edndices e planos de execu\u00e7\u00e3o para atingir a m\u00e1xima efici\u00eancia.<\/p>\n<div style=\"margin:48px 0 32px;padding:32px 24px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:16px;text-align:center;\">\n<p style=\"margin:0 0 8px;font-size:17px;color:#111827;font-weight:700;\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 24px;font-size:15px;color:#1f2937;font-weight:400;\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de PostgreSQL para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1%21+Tenho+interesse+no+treinamento+de+PostgreSQL.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:600;padding:14px 28px;border-radius:100px;text-decoration:none;box-shadow:0 4px 12px rgba(37,211,102,0.4);letter-spacing:0.01em;\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\">\n      <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/>\n    <\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aprenda sobre CTEs: descubra o poder das WITH queries e o potencial do WITH RECURSIVE no PostgreSQL. Melhore suas consultas agora!<\/p>\n","protected":false},"author":1,"featured_media":844,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[75],"tags":[1478,1477,1474,1063,1475,1476],"class_list":["post-845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-common-table-expressions","tag-consultas-recursivas-postgresql","tag-cte-postgresql","tag-otimizacao-de-consultas-sql","tag-with-queries-postgresql","tag-with-recursive"],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=845"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/845\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/844"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}