Select
包含 select 的 Select 表達式的行為
考慮以下設置:
CREATE TABLE NAMES(Id integer PRIMARY KEY, Name text); INSERT INTO NAMES VALUES(1,'Tom'); INSERT INTO NAMES VALUES(2,'Lucy'); INSERT INTO NAMES VALUES(3,'Frank'); CREATE TABLE fields(fid integer, fname text); INSERT into fields values(1, "Id"); insert into fields values(2, "Name"); SELECT name, (SELECT "Name") FROM NAMES;
最後一條語句將輸出
Tom|Tom Lucy|Lucy Frank|Frank
但是,雖然
select fname from fields where fid=2
產生("Name")
(作為單單元格表),但將上述查詢中的最後一條語句替換為SELECT name, (select fname from fields where fid=2) FROM NAMES;
給
Tom|Name Lucy|Name Frank|Name
為什麼?這是故意的嗎?
注意:這已經使用 SQLite v3.20 進行了測試
在 SQL
'single quotes'
中,用於字元串值,而"double quotes"
用於表/列名稱。SQLite允許所有類型的引號與其他數據庫兼容,但如果可能,它首先使用正確的解釋。
所以在子查詢
(SELECT "Name")
中,它會嘗試使用一個名為的列Name
,並且有一個。換句話說,第一個查詢被解釋為:SELECT NAMES.Name, (SELECT NAMES.Name) FROM NAMES;
(子查詢僅引用外部查詢的目前行中的值;這是相關子查詢的一個相當無意義的實例。)
SQLite 被設計為一個嵌入式數據庫,可以從“真正的”程式語言訪問,因此它沒有內置的動態 SQL 機制。您必須單獨進行列名查找:
cursor = db.execute("select fname from fields where fid = ?", [2]) fname = cursor.fetchone()[0] cursor = db.execute("SELECT name, {} FROM NAMES".format(fname)) for name, othercolumn in cursor: ...