2015-04-28 397 views
2

問題:由於FROM子句的WHERE子句前執行邏輯,不應該也有可能使用在WHERE,子查詢FROM-子查詢的結果?使用的結果FROM-子查詢的WHERE,子查詢

例如:

假設下表中的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,以輸出單個行與該name最大salary

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

回答

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使用,但不是「表」。

+1

FYI這就是所謂的「公用表表達式」:https://www.sqlite.org/lang_with.html – AaronLS

+0

不幸的是,直到最近,sqlite3的不支持WITH子句。是否有解決方法(除了創建一個臨時表,這不是線程安全的,除非我缺少一個簡單的方法來使其安全)? – AlwaysLearning