在WHERE-subquery中使用FROM-subquery的结果

时间:2015-04-28 16:32:01

标签: sql sqlite

问题:由于FROM子句在WHERE子句之前是逻辑执行的,因此不应该在WHERE子查询中使用FROM子查询的结果吗?

例如:

假设在sqlite3中定义了下表:

create table MyTable(name, data1, data2, salary);
insert into MyTable values('J', 4, 8, 30);
insert into MyTable values('J', 8, 4, 30);
insert into MyTable values('J', 16, 16, 20);
insert into MyTable values('Dan', 32, 32, 25);

以下查询针对每个name,针对该salary输出具有最大name的单行:

select name1 as name, data1, data2, salary
from (
    select rowid, name as name1, data1, data2, salary 
    from MyTable 
    where salary=(
        select max(salary) from MyTable where name=name1) 
    ) T
where rowid = (
    select max(rowid)
    from T
    where name1 = name);

然而,sqlite3给出了错误: 错误:第11行附近:没有这样的表:T

1 个答案:

答案 0 :(得分:3)

如果要多次使用子查询的结果,请使用with,而不是子查询:

with T as (
      select rowid, name as name1, data1, data2, salary 
      from MyTable 
      where salary = (select max(salary) from MyTable where name=name1) 
     ) 
select name1 as name, data1, data2, salary
from T
where rowid = (select max(rowid) from T where name1 = name);

你的问题的答案显然是“不”。 SQLite不允许你想要的东西。也没有任何其他版本的SQL。 FROM子句定义了可用于限定列的表别名,但这些别名不能在另一个FROM子句中重用。请注意,可以在WHERE中使用,但不能在“表格”中使用。