幾年前我寫了一個 Python 瓶子應用程式,它使用了以下查詢:
SELECT * FROM (
SELECT a.*,
GROUP_CONCAT(st.ID) AS Sentences
FROM (
SELECT sc.ID, sc.Title_PT, sc.Title_DE, sc.Parent_ID, GROUP_CONCAT(sc2.ID) AS Children
FROM Section AS sc
LEFT JOIN Section AS sc2 ON sc2.Parent_ID = sc.ID
GROUP BY sc2.Parent_ID
) AS a
LEFT JOIN Sentence AS st ON st.Section_ID = a.ID
GROUP BY a.ID
UNION
SELECT sc.ID, sc.Title_PT, sc.Title_DE, sc.Parent_ID, NULL AS Children, GROUP_CONCAT(st.ID) AS Sentences
FROM Section AS sc
LEFT JOIN Sentence AS st ON st.Section_ID = sc.ID
GROUP BY sc.ID
)
GROUP BY ID
ORDER BY Parent_ID;
它曾經正確回傳如下內容:
ID |Title_PT |Title_DE |Parent_ID |Children |Sentences
1 |Idioma geral 1 - Express?es comuns em contextos específicos |Gebr?uchliche Ausdrücke in spezifischen Kontexten |2,7,8,12,20,25,26,30,38,39,42,43,44,45,50,54,58,59,60,71,72,73,76,77,78,89,92,93,123,127,142 |2530,2571
其中每一行都提到了本書的一個部分 (Section.ID),其子部分的 ID (兒童列)和屬于該部分的所有單個句子的 ID (句子列) 。我已經在 SQLite Expert Professional 的舊版本(3.5,從 2013 年開始)上對此進行了測驗,并且運行良好。
但是,當我在較新版本的 sqlite3.exe(3.35.5,從 2021 年開始)中運行相同的查詢時,“Children”欄位對所有行回傳 NULL(所以,我不知道,GROUP_CONCAT 不再作業了) :
ID |Title_PT |Title_DE |Parent_ID |Children |Sentences
1 |Idioma geral 1 - Express?es comuns em contextos específicos |Gebr?uchliche Ausdrücke in spezifischen Kontexten |NULL |2530,2571
我還嘗試使用 Python 3.10 和 sqlite3 庫來重現它,但我遇到了同樣的問題。有誰知道最近的 SQLite 中可能發生了什么改變破壞了我的代碼?
資料庫中的模式(一本多語言的句子書,按章節/主題組織,以及其他語言的等價物):
CREATE TABLE [Sentence] (
ID INTEGER PRIMARY KEY,
Section_ID INTEGER,
Sentence_PT CHAR(1024) NOT NULL,
Sentence_DE CHAR(1024),
Sentence_EN CHAR(1024),
Sentence_ES CHAR(1024)
);
CREATE TABLE [Section] (
ID INTEGER PRIMARY KEY,
Parent_ID INTEGER REFERENCES Section(ID),
Title_PT CHAR(1024),
Title_DE CHAR(1024),
Title_EN CHAR(1024),
Title_ES CHAR(1024)
);
編輯:這是一個小提琴:https ://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=c31242bb38d85afcd1acfc8f57d1dd99
uj5u.com熱心網友回復:
實際上,您使用舊版本的 SQLite 得到的正確結果恰好是正確的。在您的代碼中,您僅按 1 列分組并選擇子句
中不存在的許多列。
大多數資料庫都不允許這樣做,但 SQLite 允許這樣做,這會導致意外結果,因為 SQLite 會選擇(幾乎)任意行來選擇所有未聚合列的值。GROUP BY
因為它是您的代碼,所以您可以將聚合與MAX()列的函式一起使用Children以獲得非空值(如果存在):
SELECT ID, Title_PT, Title_DE, Parent_ID ,
MAX(Children) AS Children,
Sentences
FROM (
SELECT a.*,
GROUP_CONCAT(st.ID) AS Sentences
FROM (
SELECT sc.ID, sc.Title_PT, sc.Title_DE, sc.Parent_ID, GROUP_CONCAT(sc2.ID) AS Children
FROM Section AS sc
LEFT JOIN Section AS sc2 ON sc2.Parent_ID = sc.ID
GROUP BY sc2.Parent_ID
) AS a
LEFT JOIN Sentence AS st ON st.Section_ID = a.ID
GROUP BY a.ID
UNION
SELECT sc.ID, sc.Title_PT, sc.Title_DE, sc.Parent_ID, NULL AS Children, GROUP_CONCAT(st.ID) AS Sentences
FROM Section AS sc
LEFT JOIN Sentence AS st ON st.Section_ID = sc.ID
GROUP BY sc.ID
)
GROUP BY ID
ORDER BY Parent_ID;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/467190.html
標籤:sqlite
