如何解决SQLite3:如何使用超过 200 个`FROM` 子句进行`LEFT JOIN`?
我正在尝试制定一个 SQLite 3 语句(使用 Python 的 sqlite3 库执行),该语句将一堆具有相同列和索引的表连接起来,以形成一个汇总所有数据的大表(最终将是输出为 CSV)。
脚本的问题部分如下所示。
with sqlite3.connect("database.db") as conn:
# Create a statment to merge individual tables into one big table indexed by index_col,# with columns representing individual sets of values.
all_column_names = ["<the tables' names,which will be column names in the final table>"]
all_column_names_as = ",".join(f'{n}.value AS "{n}"' for n in all_column_names)
all_joins = "\n".join(f"LEFT JOIN {n} ON {n}.index_col={all_column_names[0]}.index_name" for n in all_column_names[1::])
select_statement = f"""
SELECT {all_column_names[0]}.index_col,{all_column_names_as}
FROM {all_column_names[0]}
{all_joins};
"""
# Execute the SELECT statement.
conn.execute(select_statement)
为了更好地解释,这三个列表推导式创建了一些术语,这些术语组合成一个大的 SELECT
语句,然后执行。语句如下所示:
SELECT table_0.index_col,table_0.value AS table_0,table_1.value AS table_1,table_2.value AS table_2
FROM table_0
LEFT JOIN table_1 ON table_1.index_col=table_0.index_col
LEFT JOIN table_2 ON table_2.index_col=table_0.index_col;
较小的 table_0..2
表是这样创建的。
CREATE TABLE IF NOT EXISTS
table_0 (
index_col INTEGER PRIMARY KEY,value REAL
);
这会生成一个如下所示的表格:
// E.g.,table_0; they all look like this.
index_col table_0
01 0.001
02 0.5
03 0.1
// Final table
index_col table_0 table_1 table_2
01 0.001 0.0012 0.01
02 0.5 0.62 0.67
03 0.1 0.2 0.15
我遇到的问题与 FROM
中 LEFT JOIN
子句的最大限制有关,即 200。
Traceback (most recent call last):
File "<redacted>",line <redacted>,in execute
cur.execute(*args,**kwargs)
sqlite3.OperationalError: too many FROM clause terms,max: 200
显然,这不是一种有效的方法,并且重新编译 SQLite 二进制文件以允许超过 200 个 FROM
子句是不可接受的。
我正在寻找能够计算相同最终表但不会失败的任何解决方案。如果这需要 LEFT JOIN
来制作部分表格,然后最后将它们组合起来,那没关系。如果有更好的方法来编写不会遇到限制的 SQL 语句,或者只是实现相同目的的不同 SQL 语句,那也很好。
背景: 之所以使用SQL,是因为我受RAM的限制;写入磁盘较慢,但允许我对数据进行操作,因为行像 Python 生成器一样返回。以前,尝试使用本机 Python 数据类型以及内存中的 Pandas DataFrame 生成然后连接数据导致我用完了 RAM,所以我不会在 Pandas(或其他库)中寻找解决方案,除非它实现起来要简单得多.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。