左加入谷歌大查询

时间:2016-05-16 19:28:40

标签: join left-join google-bigquery

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

此左连接仅用于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 个答案:

答案 0 :(得分: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

或提高表现(根据费利佩的建议):

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