问题描述
我正在尝试制定一个 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 (将#修改为@)