BigQuery - 从 UI 提交时相同的查询有效,并报告批处理中的 SQL 语法错误
BigQuery - same query works when submitted from UI and reports SQL syntax error from batch
我有一个 SQL 查询涉及不同字段上的两个联接。
当我运行这个查询在UI中交互时,我得到了一个结果集,没问题。当我批量提交完全相同的查询时,返回 SQL 语法错误:
JOIN 中的字段名称不明确 'video'。请在字段名称前使用 table 限定符。
但是连接已经完全合格:
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-ocean-426,批处理作业 ID 是 job_1YPDj1wNHPg82aZcvRKjD3coykg
如果我从这个作业中提取查询并将其粘贴到 UI,它就可以工作(在将 \n 更改为 returns 之后)。
成功查询和失败查询之间的区别似乎是您在 运行 批量查询时设置 flattenResults=false
。此模式与 JOIN 的行为略有不同,可能会导致像这样的细微问题。
BigQuery executes multiple JOIN operations pairwise, starting with the
first pair of inputs after the FROM keyword. Subsequent JOIN
operations use the results of the previous JOIN operation as the left
JOIN input.
这里的根本问题是查询中最终 JOIN 的左侧源试图将 t1.video 和 t2.video 折叠到同一范围内,两者的名称都为 "video" ,并导致此错误。
此问题的简单复制器如下,flattenResults=false
:
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
您有几个选项可以使此查询有效:
- 停止设置
flattenResults=false
。我可能是错的,但从您的查询来看,它看起来不像 return 任何嵌套或重复的字段,因此可能没有必要。
重命名 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
将第一个 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;
我有一个 SQL 查询涉及不同字段上的两个联接。
当我运行这个查询在UI中交互时,我得到了一个结果集,没问题。当我批量提交完全相同的查询时,返回 SQL 语法错误:
JOIN 中的字段名称不明确 'video'。请在字段名称前使用 table 限定符。
但是连接已经完全合格:
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-ocean-426,批处理作业 ID 是 job_1YPDj1wNHPg82aZcvRKjD3coykg
如果我从这个作业中提取查询并将其粘贴到 UI,它就可以工作(在将 \n 更改为 returns 之后)。
成功查询和失败查询之间的区别似乎是您在 运行 批量查询时设置 flattenResults=false
。此模式与 JOIN 的行为略有不同,可能会导致像这样的细微问题。
BigQuery executes multiple JOIN operations pairwise, starting with the first pair of inputs after the FROM keyword. Subsequent JOIN operations use the results of the previous JOIN operation as the left JOIN input.
这里的根本问题是查询中最终 JOIN 的左侧源试图将 t1.video 和 t2.video 折叠到同一范围内,两者的名称都为 "video" ,并导致此错误。
此问题的简单复制器如下,flattenResults=false
:
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
您有几个选项可以使此查询有效:
- 停止设置
flattenResults=false
。我可能是错的,但从您的查询来看,它看起来不像 return 任何嵌套或重复的字段,因此可能没有必要。 重命名 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
将第一个 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;