Skip to content

Last modified: April 28, 2025

WITH

Nested queries in the FROM clause:

SELECT X.pname  
FROM (SELECT *  
    FROM Product AS Y  
    WHERE price > 20) as X
WHERE X.price < 500


Use WITH to assign a name to a result so it can be reused:

WITH expensiveprods as (
    SELECT *
    FROM Product AS Y
    WHERE price > 20
)
SELECT X.pname
FROM expensiveprods as X
WHERE X.price < 500


Multiple results can be named

WITH
seattlecompanies as (
    SELECT *
    FROM Company
    WHERE city = ‘Seattle’
),
expensiveprods as (
    SELECT *
    FROM Product AS Y
    WHERE price > 20
)
SELECT s.cname, e.pname
FROM expensiveprods e, seattlecompanies s
WHERE e.cid = s.cid


Results can refer to previous results:

WITH  
seattlecompanies as (  
    SELECT *  
    FROM Company  
    WHERE city = ‘Seattle’  
),  
seattleprods as (  
    SELECT p.*  
    FROM Product p, seattlecompanies s  
    WHERE p.cid = s.cid  
),  
cheapseattleprods as (  
    SELECT *  
    FROM seattleprods p  
    WHERE price < 100  
),  
SELECT * FROM cheapseattleprods


Example: Find companies that sell both cheap and expensive products

WITH  
    cheap as (  
    SELECT cid  
    FROM Product p, Company c  
    WHERE p.cid = c.cid  
    AND p.price < 10  
)  
expensive as (  
    SELECT cid  
    FROM Product p, Company c  
    WHERE p.cid = c.cid  
    AND p.price > 100  
)  
SELECT cname FROM Company c, cheap, expensive  
WHERE c.cid = cheap.cid  
AND c.cid = expensive.cid