问题:由于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
答案 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
中使用,但不能在“表格”中使用。