Join 使用比较器连接BQ表

Join 使用比较器连接BQ表,join,google-bigquery,Join,Google Bigquery,我被这个问题难住了!我有一个表Logs.Customer\u Internet\u Activity\u Information,其中包含客户的测试数据。表中有一个IP地址。在另一张桌子上 Logs.IP有一个startIpnum和一个endIpNum和一个localID。startIPnum是范围内较低的IP地址,endIpNum是范围内的最大IP地址。每个范围都有一个参考城市、国家等的本地ID 我的查询试图查找范围内的客户IP,以查找本地ID Select t1.email ,t1.IP ,

我被这个问题难住了!我有一个表
Logs.Customer\u Internet\u Activity\u Information
,其中包含客户的测试数据。表中有一个IP地址。在另一张桌子上
Logs.IP
有一个
startIpnum
和一个
endIpNum
和一个
localID
startIPnum
是范围内较低的IP地址,
endIpNum
是范围内的最大IP地址。每个范围都有一个参考城市、国家等的本地ID

我的查询试图查找范围内的客户IP,以查找本地ID

Select t1.email ,t1.IP , t2.Local_ID

from [TablewithcustomerIP address] as t1 cross join [table with IP ranges] as t2

where t1.IP between t2.startIpNum and t2.endIpNum

因此,您遇到的直接问题是Google不允许每个
交叉连接

这有点像黑客,但如果性能不是您的问题,您可以尝试:

select
  t1.email
  ,t1.IP
  ,t2.Local_ID

from (select true as dummy, email, Ip from [TablewithcustomerIP address]) as t1
inner join each (select true as dummy,Local_ID, startIpNum, endIpNum from [table with IP ranges]) as t2
  on t2.dummy = t1.dummy

where t1.IP between t2.startIpNum and t2.endIpNum

然而,查询可能需要很长时间才能完成,如果有的话。更好的解决方案是在您的
where
条件下加入,但不幸的是,目前不可能加入。我急切地等待着谷歌添加自定义连接条件的那一天,这可能是我最怀念的SQL的特性

你能评论一下你的查询当前做了什么,以及这与你想要的行为有何不同吗?我甚至在切换表时也会遇到这个错误。。。3.96-3.168:联接运算符的右侧表必须是一个小表。如果左侧的表较小,请切换表;如果两个表都大于中所述的最大值,请使用JOIN EACH。是否尝试按照错误指示将“JOIN”更改为“JOIN EACH”?或者,如果t1较小,请尝试反转它们?你说当你换桌子的时候你得到了这个。。。。如果不切换它们,会得到什么?当我反转联接上的表时,错误消息:错误:3.74-3.167:联接运算符的右侧表必须是一个小表。如果左侧表较小,则切换表;如果两个表都大于中所述的最大值,则使用JOIN EACH。如果我尝试每个连接,它需要一个ON子句..这两个表之间没有链接变量..hmmmm。。。对此不确定,但我认为您可以执行“在t1.IP之间…”并使其工作。。。如果这不起作用,请让我知道,可能有一种方法可以使用子查询来获取您想要的内容,但超时了…查询失败错误:请求超时。请再试一次。工作ID:practicum-2015:Job_UAMbi8hq_RdeBTmED9Ux6_6akl0我担心这可能会发生。你能估计一下这两个表的大小,以及你期望t1中的Ip地址在t2中的范围是多少吗?@ticketymr另一个可能有用但高度依赖于数据的方法是使用数学创建一个“子网”属性(包含Ip的前两部分),然后将其与连接上的=匹配。从这里开始,where子句中的between可以起作用。您需要将IP除以(256*256)得到IP的前两部分,然后将其与=。。。但这实际上取决于第二个表中的范围。IP范围约为200万的表,客户IP地址约为100万的表。客户IP跨越IP范围的98%,这意味着单个IP可能进入的范围数,以估计结果集的大小。也就是说,关于你能做什么,我没有更多的想法-/