postgresql


Common Table Expressions (WITH) All Versions

8.0
8.1
8.2
8.3
8.4
9.0
9.1
9.2
9.3
9.4
9.5

This draft deletes the entire topic.

inline side-by-side expand all collapse all

Examples

  • 0

    Common table expressions support extracting portions of larger queries. For example:

    WITH sales AS (
      SELECT 
        orders.ordered_at,
        orders.user_id,
        SUM(orders.amount) AS total
      FROM orders
      GROUP BY orders.ordered_at, orders.user_id
    )
    SELECT 
      sales.ordered_at,
      sales.total,
      users.name
    FROM sales 
    JOIN users USING (user_id)
    
  • 0
    create table empl (
        name text primary key,
        boss text null
            references name 
                on update cascade 
                on delete cascade 
            default null
    );
    
    insert into empl values ('Paul',null);
    insert into empl values ('Luke','Paul');
    insert into empl values ('Kate','Paul');
    insert into empl values ('Marge','Kate');
    insert into empl values ('Edith','Kate');
    insert into empl values ('Pam','Kate');
    insert into empl values ('Carol','Luke');
    insert into empl values ('John','Luke');
    insert into empl values ('Jack','Carol');
    insert into empl values ('Alex','Carol');
    
    with recursive t(level,path,boss,name) as (
            select 0,name,boss,name from empl where boss is null
        union
            select
                level + 1,
                path || ' > ' || empl.name,
                empl.boss,
                empl.name 
            from 
                empl join t 
                    on empl.boss = t.name
    ) select * from t order by path;
    

I am downvoting this example because it is...

Syntax

Syntax

Parameters

Parameters

Remarks

Remarks

Still have question about Common Table Expressions (WITH)? Ask Question

Common Table Expressions in SELECT Queries

0

Common table expressions support extracting portions of larger queries. For example:

WITH sales AS (
  SELECT 
    orders.ordered_at,
    orders.user_id,
    SUM(orders.amount) AS total
  FROM orders
  GROUP BY orders.ordered_at, orders.user_id
)
SELECT 
  sales.ordered_at,
  sales.total,
  users.name
FROM sales 
JOIN users USING (user_id)

Traversing tree using WITH RECURSIVE

0
create table empl (
    name text primary key,
    boss text null
        references name 
            on update cascade 
            on delete cascade 
        default null
);

insert into empl values ('Paul',null);
insert into empl values ('Luke','Paul');
insert into empl values ('Kate','Paul');
insert into empl values ('Marge','Kate');
insert into empl values ('Edith','Kate');
insert into empl values ('Pam','Kate');
insert into empl values ('Carol','Luke');
insert into empl values ('John','Luke');
insert into empl values ('Jack','Carol');
insert into empl values ('Alex','Carol');

with recursive t(level,path,boss,name) as (
        select 0,name,boss,name from empl where boss is null
    union
        select
            level + 1,
            path || ' > ' || empl.name,
            empl.boss,
            empl.name 
        from 
            empl join t 
                on empl.boss = t.name
) select * from t order by path;

Topic Outline