问题:既然 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

最佳答案

如果要多次使用子查询的结果,请使用 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 中使用,但不能在“表”中使用。

关于sql - 在 WHERE-subquery 中使用 FROM-subquery 的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29924989/

10-12 13:05
查看更多