【问题标题】:SELECT UNION query with random rows from multiple tables使用来自多个表的随机行的 SELECT UNION 查询
【发布时间】:2018-06-20 22:04:21
【问题描述】:

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

谢谢你的帮助,

【问题讨论】:

    标签: python sql pandas sqlite


    【解决方案1】:

    考虑使用派生表(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)
    

    【讨论】:

    • 谢谢!我想避免连接数据帧
    【解决方案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;
    """
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-12
      • 2023-03-04
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2023-03-24
      • 2019-04-20
      相关资源
      最近更新 更多