左加入谷歌大查询
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 有更多问题 - 也已修复 - 现在第一个查询也应该可以工作。但第二个更理想以上是关于左加入谷歌大查询的主要内容,如果未能解决你的问题,请参考以下文章