Hello!

I am curious what is a particular reason that aliased columns in a query not 
visible to sub-queries?

CREATE TABLE foo(
    id INTEGER,
    bar INTEGER
);

INSERT INTO foo VALUES(1, 2), (3, 4);

SELECT 1 as super_id, (SELECT bar FROM foo WHERE id = super_id);

Gives an error:
Error: no such column: super_id

On the other hand, we can easily refer to values of a table that participates 
in a query.

CREATE TABLE baz(
    id INTEGER,
    qux INTEGER
);

INSERT INTO baz VALUES(1, 6), (2, 8);

SELECT id, (SELECT qux FROM baz WHERE id = foo.id) FROM foo;

id          (SELECT qux FROM baz WHERE id = foo.id)
----------  ---------------------------------------
1           6                                      
3                   

But still not though alias:

SELECT id as super_id, (SELECT qux FROM baz WHERE id = super_id) FROM foo;
Error: no such column: super_id

--------------------------------------------------------------------------------------------------------------------------------

Why would this be useful?

Sometimes you need a sub-select by a result of an expression.

SELECT ..., <expression X>, (SELECT ... FROM FOO where id = <result of 
expression X>) ..;

Of course it is possible to duplicate expression in sub-query

SELECT ..., <expression X>, (SELECT ... FROM FOO where id = <expression X>) ..;

But this would not be as efficient as to access result of already evaluated 
expression.
Especially if <expression X> itself is a sub-select. Also imagine a chain of 
sub-queries.


Reply via email to