左加入谷歌大查询

Posted

技术标签:

【中文标题】左加入谷歌大查询【英文标题】:Left join in google big query 【发布时间】:2016-05-16 19:28:39 【问题描述】:

我有这个错误“ON 子句必须是 AND of = 每个表中一个字段名的比较,所有字段名都以表名作为前缀。

此左连接仅用于 c.Network,其他情况则不需要。我理解错误,但两个表(bigdata:RawDebug.T 和 bigdata:RawDebug.CarrierDetails)之间没有公共字段。所以我不能在“ON”语句中引用两个表。

任何帮助将不胜感激!

 DEFINE QUERY Test2 
 SELECT 
 HardwareId, DebugReason, DebugData, 
 CASE 
  WHEN lower(DebugData) LIKE 'ver%' THEN 'Verizon'
  WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network
  ELSE REGEXP_REPLACE(DebugData,'\\?',' ')
 END
 as ActualDebugData 
 FROM (TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP ('2016-05-15'),TIMESTAMP('2016-05-15'))) as d
 LEFT JOIN [bigdata:RawDebug.CarrierDetails] as c ON c.Mcc = 289 AND c.Mnc = 88
  WHERE d.reason = 50013

【问题讨论】:

【参考方案1】:
SELECT 
  HardwareId, DebugReason, DebugData, 
  CASE 
    WHEN LOWER(DebugData) LIKE 'ver%' THEN 'Verizon'
    WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network
    ELSE REGEXP_REPLACE(DebugData,'\\?',' ')
  END AS ActualDebugData 
FROM (
  SELECT *
  FROM TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP ('2016-05-15'),TIMESTAMP('2016-05-15'))
) AS d
CROSS JOIN (
  SELECT Network 
  FROM [bigdata:RawDebug.CarrierDetails] 
  WHERE Mcc = 289 AND Mnc = 88 
  LIMIT 1 
) AS c 
WHERE d.reason = 50013

或提高性能(根据 Felipe 的建议):

SELECT 
  HardwareId, DebugReason, DebugData, 
  CASE 
    WHEN LOWER(DebugData) LIKE 'ver%' THEN 'Verizon'
    WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network
    ELSE REGEXP_REPLACE(DebugData,'\\?',' ')
  END AS ActualDebugData 
FROM (
  SELECT 
    HardwareId, DebugReason, DebugData
  FROM TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP ('2016-05-15'),TIMESTAMP('2016-05-15'))
  WHERE reason = 50013      
) AS d
CROSS JOIN (
  SELECT Network 
  FROM [bigdata:RawDebug.CarrierDetails] 
  WHERE Mcc = 289 AND Mnc = 88 
  LIMIT 1 
) AS c 

【讨论】:

是否可以将“WHERE d.reason = 50013”移动到子选择(可能性能更好) 完全同意 - 将它移到 d 子选择中会更好 我收到此错误“在 JOIN 的任何一侧都找不到字段 'd.reason'” 尝试第二个查询 - 它应该更好地处理这个:o) 您的原始查询比仅使用 ON 有更多问题 - 也已修复 - 现在第一个查询也应该可以工作。但第二个更理想

以上是关于左加入谷歌大查询的主要内容,如果未能解决你的问题,请参考以下文章

左连接以填充谷歌大查询中 2 个表中的数据

谷歌大查询:需要帮助将 Postgres 查询转换为谷歌大查询

谷歌大查询命令行执行复杂查询给出错误意外'('

实时设置环境变量。谷歌大查询

谷歌大查询确切在哪里

谷歌大查询限制子句返回太多行