【问题标题】:Support UNION function in BigQuery SQL在 BigQuery SQL 中支持 UNION 函数
【发布时间】:2012-05-25 13:51:12
【问题描述】:

BigQuery 似乎尚不支持 UNION: https://developers.google.com/bigquery/docs/query-reference

(我的意思不是为了源将表联合在一起。它有。)

快到了吗?

【问题讨论】:

    标签: sql google-bigquery union


    【解决方案1】:

    如果您想要 UNION 以便您可以组合查询结果,您可以使用子选择 在 BigQuery 中:

    SELECT foo, bar 
    FROM
      (SELECT integer(id) AS foo, string(title) AS bar 
       FROM publicdata:samples.wikipedia limit 10),
      (SELECT integer(year) AS foo, string(state) AS bar 
       FROM publicdata:samples.natality limit 10);
    

    这几乎完全等同于 SQL

    SELECT id AS foo, title AS bar 
    FROM publicdata:samples.wikipedia limit 10
    UNION ALL
    SELECT year AS foo, state AS bar 
    FROM publicdata:samples.natality limit 10;
    

    (请注意,如果想要 SQL UNION 而不是 UNION ALL,这将不起作用)

    或者,您可以运行两个查询并附加结果。

    【讨论】:

    • 啊……非常聪明。在我的情况下,附加两个查询不是一个选项,但这种结构看起来应该可以工作。
    • 正如您所提到的,这不完全是一个 UNION,而是一个 UNION ALL See other post
    • 你好@Jordan-Tigani 如果我调用上面的类似查询,那么顶级记录将是维基百科,然后是出生记录。我想知道序列是否保持。只是想澄清一下。
    • BigQuery 不保证排序,除非您使用 ORDER BY。因此,如果您使用表联合,则无法保证您将获得结果的顺序。
    • 仅供参考:在子查询中 IGNORE CASE 在所有查询结束时不在子查询中。即 SELECT bar FROM (SELECT string(title) AS bar FROM publicdata:samples.wikipedia where title contains 'any' limit 10), (SELECT string(state) AS bar FROM publicdata:samples.natality where state contains 'any' limit 10 ) 忽略大小写; (刚分享的问题)
    【解决方案2】:

    BigQuery 最近增加了对Standard SQL 的支持,包括UNION 操作


    通过 Web UI 提交查询时,只需确保取消选中 SQL 版本标题下的“使用旧版 SQL”即可:

    【讨论】:

    • 重要的是您应该将 UNION 与第二个关键字一起使用:UNION ALL 或 UNION DISTINCT,请参阅 the following link
    • @RogierWerschkull 真实数据。
    【解决方案3】:

    你总是可以这样做的:

    SELECT * FROM (query 1), (query 2);
    

    它的作用与:

    SELECT * from query1 UNION select * from query 2;
    

    【讨论】:

    • 是的,这行得通。这与乔丹 2.5 年前发布的内容相同。
    【解决方案4】:

    请注意,如果您使用的是标准 SQL,则逗号运算符现在表示 JOIN - you have to use the UNION syntax if you want a union

    在旧版 SQL 中,逗号运算符在应用于表时具有 UNION ALL 的非标准含义。在标准 SQL 中,逗号运算符具有标准的 JOIN 含义。

    例如:

    #standardSQL
    SELECT
        column_name,
        count(*)
    from
        (SELECT * FROM me.table1 UNION ALL SELECT * FROM me.table2)
    group by 1
    

    【讨论】:

      【解决方案5】:

      这对我使用大查询的 StandardSQL 进行 UNION INTERSECT 帮助很大。

      #standardSQL
      WITH
        a AS (
        SELECT
          *
        FROM
          table_a),
        b AS (
        SELECT
          *
        FROM
          table_b)
      SELECT
        *
      FROM
        a INTERSECT DISTINCT
      SELECT
        *
      FROM
        b
      

      我从 https://gist.github.com/yancya/bf38d1b60edf972140492e3efd0955d0 窃取/修改了这个示例

      【讨论】:

        【解决方案6】:

        确实支持联合。您发布的链接的摘录:

        注意:与许多其他基于 SQL 的系统不同,BigQuery 使用逗号语法来表示表联合,而不是连接。这意味着您可以对多个具有兼容架构的表运行查询,如下所示:

        // 发现几天内的可疑活动

        SELECT FORMAT_UTC_USEC(event.timestamp_in_usec) AS time, request_url
          FROM [applogs.events_20120501], [applogs.events_20120502], [applogs.events_20120503]
          WHERE event.username = 'root' AND NOT event.source_ip.is_internal;
        

        【讨论】:

        • 指将表联合在一起作为源。这就是我特别提到的不是我需要的功能。
        • 啊,我明白了。最初,我没有理解您所说的“为源头联合”的意思。实际上,我最终做了类似于 Jordan 针对需要结果集中的表名的场景所建议的事情。我将 table_name 放在内部查询中并从外部查询中选择它们,例如SELECT table_name, title, state FROM (SELECT "publicdata:samples.wikipedia" AS table_name, string(title) AS title FROM publicdata:samples.wikipedia limit 10), (SELECT "publicdata:samples.natality" AS table_name, string(state ) AS state FROM publicdata:samples.natality limit 10)
        猜你喜欢
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多