代码之家  ›  专栏  ›  技术社区  ›  user1849860

BigQuery-从UI提交相同的查询,并从批处理报告SQL语法错误

  •  4
  • user1849860  · 技术社区  · 11 年前

    我有一个SQL查询,涉及不同字段上的两个连接。

    当我在UI中以交互方式运行这个查询时,我会得到一个结果集,没有问题。当我批量提交完全相同的查询时,我得到一个SQL语法错误:

    JOIN中的字段名“video”不明确。请在字段名之前使用表限定符。

    但连接已经完全合格:

    SELECT 
    t1.video AS video
    t1.session AS session
    ...
    FROM
    (select video, session, ...) t1
    LEFT JOIN EACH
    (select video, ...) t2
    ON t1.video = t2.video
    LEFT JOIN EACH
    (select session ...) t3
    ON t1.session = t3.session
    

    是否有Google Big Query的人看到了这一点,项目是rising-coean-426,批处理作业id是job_1YPDj1wNHPg82aZcvRKjD3coykg

    如果我从该作业中提取查询并将其粘贴到UI中,它就会工作(在更改为返回后)。

    1 回复  |  直到 11 年前
        1
  •  4
  •   Danny Kitt    11 年前

    成功查询和失败查询之间的区别似乎是您正在设置 flattenResults=false 当您批量运行查询时。这种模式与JOIN的行为略有不同,可能会导致类似这样的微妙问题。

    从…起 BigQuery docs on JOINs :

    BigQuery成对执行多个JOIN操作,从 FROM关键字后的第一对输入。后续JOIN 操作使用上一个JOIN操作的结果作为左侧 JOIN输入。

    这里的根本问题是,查询中最后一个JOIN的左侧源试图将t1.video和t2.video折叠到同一个范围中,都使用名称“video”,并导致此错误。

    本期的一个简单复制器如下 flattenResults=假 :

    SELECT t1.video
    FROM (SELECT 17 as video, 18 as session) t1
    JOIN (SELECT 17 as video) t2
    ON t1.video = t2.video
    JOIN (SELECT 18 as session) t3
    ON t1.session = t3.session
    

    您有两个选项可以使此查询正常工作:

    1. 停止设置 flattenResults=假 。我可能是错的,但仔细看一下您的查询,它似乎不会返回任何嵌套或重复的字段,因此可能没有必要。
    2. 重命名t1或t2中的一个视频字段。例如。:

      SELECT t1.video
      FROM (SELECT 17 as video, 18 as session) t1
      JOIN (SELECT 17 as video2) t2
      ON t1.video = t2.video2
      JOIN (SELECT 18 as session) t3
      ON t1.session = t3.session
      
    3. 在子选择中包装第一个JOIN。这允许您通过只选择一个视频字段来消除歧义。例如。:

      SELECT t1_and_t2.video FROM
        (SELECT t1.video as video, t1.session as session
        FROM (SELECT 17 as video, 18 as session) t1
        JOIN (SELECT 17 as video) t2 
        ON t1.video = t2.video) t1_and_t2
      JOIN (SELECT 18 as session) t3
      ON t1_and_t2.session = t3.session;