SELECT UNION查询包含来自多个表的随机行

时间:2018-01-11 14:28:19

标签: python sql pandas sqlite

我有不同的表: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中提取了多少行

感谢您的帮助,

2 个答案:

答案 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
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;
"""