Select

包含 select 的 Select 表達式的行為

  • January 6, 2018

考慮以下設置:

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:
   ...

引用自:https://dba.stackexchange.com/questions/194550