Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在WHERE子查询中使用FROM子查询的结果_Sql_Sqlite - Fatal编程技术网

Sql 在WHERE子查询中使用FROM子查询的结果

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

问:既然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);
以下查询的目的是,对于每个
名称
,为该
名称
输出一行最大的
薪资

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子句。除了创建一个临时表之外,还有什么解决方法吗?临时表不是线程安全的,除非我缺少一个简单的方法来保证它的安全?