Sql 在WHERE子查询中使用FROM子查询的结果
问:既然FROM子句在逻辑上是在WHERE子句之前执行的,那么在WHERE子查询中不应该使用FROM子查询的结果吗 例如: 假设下表是在sqlite3中定义的:Sql 在WHERE子查询中使用FROM子查询的结果,sql,sqlite,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', 1
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);
以下查询的目的是,对于每个名称
,为该名称
输出一行最大的薪资
:
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 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
中使用,但不能在“表”中使用。仅供参考,这被称为“公共表表达式”:不幸的是,直到最近,sqlite3才支持WITH子句。除了创建一个临时表之外,还有什么解决方法吗?临时表不是线程安全的,除非我缺少一个简单的方法来保证它的安全?