BigQuery:使用COUNT作为LIMIT

时间:2018-10-10 05:27:10

标签: sql google-bigquery

我想从mytable1中选择所有内容,并将其与mytable2中的尽可能多的行合并。在我的情况下,mytable1的行总是比mytable2少,我希望最终表是每个表中数据的50-50混合。虽然我觉得以下代码在逻辑上表达了我想要的东西,但在语法上却行不通:

  

语法错误:预期为“ @”或整数文字或关键字CAST,但得到了   “(” at [3:1]

(SELECT * FROM `mytable1`)
UNION ALL (
    SELECT * FROM `mytable2`
    LIMIT (SELECT COUNT(*) FROM`mytable1`)
)

在bigquery中使用标准SQL

2 个答案:

答案 0 :(得分:2)

文档指出LIMIT子句仅接受文字或参数值。我认为您可以ROW_NUMBER()从第二张表开始的行并据此限制:

SELECT col1, col2, col3
FROM mytable1

UNION ALL

SELECT col1, col2, col3 
FROM (
    SELECT col1, col2, col3, ROW_NUMBER() OVER () AS rn
    FROM mytable2
) AS x
WHERE x.rn <= (SELECT COUNT(*) FROM mytable1)

答案 1 :(得分:0)

  • UNION中的每个SELECT语句必须具有相同数量的 列
  • 这些列还必须具有相似的数据类型
  • 每个SELECT语句中的列也必须顺序相同

由于mytable1的列始终少于mytable2的列,因此您必须通过选择放置相同数量的列

select col1,col2,col3,'' as col4 from mytable1 --in case less column you can use alias 
union all
select col1,col2,col3,col4 from mytable2