我有不同的表:A,B,C ...... 我想从每个表中选择一个给定行的数字并建立一个联合
我使用了这个查询(给定的数字= 100):
sql_query = ''' SELECT * FROM A ORDER BY RANDOM() LIMIT 100
UNION SELECT * FROM B ORDER BY RANDOM() LIMIT 100 '''
但是当我尝试阅读DataFrame时:
df=pd.read_sql(sql_query, con)
我有一个错误:
DatabaseError: Execution failed on sql : LIMIT clause should come after UNION not before
如果我在UNION之后使用LIMIT子句,它将仅返回给定行数,但我不知道每个表中提取了多少行。
示例:如果我需要A行100行和B行100行,使用UNION之后的LIMIT 200子句,我将有200行,但我不知道从A和B中提取了多少行
感谢您的帮助,
答案 0 :(得分:4)
考虑使用派生表(FROM
子句中的子查询)来设置LIMIT
。您可能还希望UNION ALL
保留重复项,否则每个表可能会收到少于100条记录。
sql_query = ''' SELECT *
FROM (SELECT * FROM A ORDER BY RANDOM() LIMIT 100)
UNION ALL
SELECT *
FROM (SELECT * FROM B ORDER BY RANDOM() LIMIT 100)'''
或者,迭代地读取每个表并连接到最终的数据帧:
sql_query = 'SELECT * FROM {} ORDER BY RANDOM() LIMIT 100'
df_list = [pd.read_sql(sql_query.format(t), con) for t in ['A', 'B']]
df = pd.concat(df_list, ignore_index=True)
答案 1 :(得分:2)
此错误来自SQLite。
使用WITH
子句或Common Table Expression (CTE):
sql_query = """
WITH
aa AS (SELECT * FROM a ORDER BY RANDOM() LIMIT 5),
bb AS (SELECT * FROM b ORDER BY RANDOM() LIMIT 5)
SELECT * FROM aa UNION SELECT * FROM bb;
"""