Search code examples
mysqlsqlmysql-error-1054

Unknown Column in Where Clause


Why MySQL claims of not finding a column? I did specify it in 'select clause'.

MySQL 5.1.39

Error Code: 1054 Unknown column 'dt' in 'where clause'

Query:

-- Generate a Table for Every Day in 2008 Year
SELECT DATE_ADD('2008-01-01',
            INTERVAL (ones.num + tens.num + hundreds.num) DAY) dt
FROM
    (SELECT 0 num UNION ALL
     SELECT 1 num UNION ALL
     SELECT 2 num UNION ALL
     SELECT 3 num UNION ALL
     SELECT 4 num UNION ALL
     SELECT 5 num UNION ALL
     SELECT 6 num UNION ALL
     SELECT 7 num UNION ALL
     SELECT 8 num UNION ALL
     SELECT 9 num) ones
CROSS JOIN
    (SELECT 0 num UNION ALL
     SELECT 10 num UNION ALL
     SELECT 20 num UNION ALL
     SELECT 30 num UNION ALL
     SELECT 40 num UNION ALL
     SELECT 50 num UNION ALL
     SELECT 60 num UNION ALL
     SELECT 70 num UNION ALL
     SELECT 80 num UNION ALL
     SELECT 90 num) tens
CROSS JOIN
    (SELECT 0 num UNION ALL
     SELECT 100 num UNION ALL
     SELECT 200 num UNION ALL
     SELECT 300 num) hundreds
WHERE YEAR(dt) < 2009
ORDER BY dt;

Solution

  • You must reference column aliases in a HAVING clause. HAVING conditions are executed on the results set after the query has been processed, as opposed to WHERE clauses which are part of the intial query execution. Because of this HAVING is able to operate on column aliases which are only available in the results set.

    -- Generate a Table for Every Day in 2008 Year
    SELECT DATE_ADD('2008-01-01',
                INTERVAL (ones.num + tens.num + hundreds.num) DAY) dt
    FROM
        (SELECT 0 num UNION ALL
         SELECT 1 num UNION ALL
         SELECT 2 num UNION ALL
         SELECT 3 num UNION ALL
         SELECT 4 num UNION ALL
         SELECT 5 num UNION ALL
         SELECT 6 num UNION ALL
         SELECT 7 num UNION ALL
         SELECT 8 num UNION ALL
         SELECT 9 num) ones
    CROSS JOIN
        (SELECT 0 num UNION ALL
         SELECT 10 num UNION ALL
         SELECT 20 num UNION ALL
         SELECT 30 num UNION ALL
         SELECT 40 num UNION ALL
         SELECT 50 num UNION ALL
         SELECT 60 num UNION ALL
         SELECT 70 num UNION ALL
         SELECT 80 num UNION ALL
         SELECT 90 num) tens
    CROSS JOIN
        (SELECT 0 num UNION ALL
         SELECT 100 num UNION ALL
         SELECT 200 num UNION ALL
         SELECT 300 num) hundreds
    HAVING YEAR(dt) < 2009
    ORDER BY dt;