2015-09-24 2 views
2

Я застрял в этом запросе! У меня есть таблица Logs.Customer_Internet_Activity_Information, которая содержит тестовые данные для клиентов. В таблице есть IP-адрес. В другом таблице Logs.IP есть startIpnum и endIpNum и localID. startIPnum - это нижний IP-адрес в диапазоне, а endIpNum - максимальный IP-адрес в диапазоне. Каждый диапазон имеет локальный идентификатор, который ссылается на город, страну и т. Д.Присоединяйтесь к таблицам BQ с помощью компаратора

Мой запрос пытается найти IP-адреса клиентов в диапазоне, чтобы найти местный идентификатор.

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 
+0

Не могли бы вы прокомментировать, что делает ваш запрос в настоящее время, и как это отличается от вашего желаемого поведения? –

+0

Я получаю эту ошибку даже при переключении таблиц ... 3.96 - 3.168: Правая таблица оператора JOIN должна быть маленькой таблицей. Переключайте таблицы, если таблица слева меньше, или используйте JOIN EACH, если обе таблицы больше, чем максимум, описанный в http://goo.gl/wXqgHs. – ticketcitymr

+0

Вы пытались сменить свой «JOIN» на «ПРИСОЕДИНЯЙТЕСЬ КАЖДОМУ», как сообщает вам об ошибке? Или, если ваш t1 меньше, попробуйте инвертировать их? И вы говорите, что получаете это, когда вы переключаете таблицы ... когда вы НЕ переключаете их, что вы получаете? – Patrice

ответ

0

Таким образом, непосредственная проблема, с которой вы сталкиваетесь, заключается в том, что Google не разрешает cross join each.

Это немного рубить, но если производительность не является проблемой для вас, вы можете попробовать:

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, но это, к сожалению, невозможно в данный момент. Я с нетерпением жду дня, когда Google добавит пользовательские условия соединения, вероятно, это особенность SQL, которую я пропускаю больше всего.

+0

Истекло время ожидания ... Ошибка запроса Ошибка: запросить время ожидания , Пожалуйста, попробуйте еще раз. Идентификатор работы: practicum-2015: job_UAMbi8hq_RdeBTmED9Ux6_6Akl0 – ticketcitymr

+0

Я боялся, что это может произойти. Не могли бы вы рассказать о размерах двух таблиц и о том, сколько диапазонов в t2 вы ожидаете получить от I1 адрес от t1? – oulenz

+0

@ticketcitymr Еще одна вещь, которая может помочь, но сильно зависит от данных, - это использовать математику для создания атрибута «подсеть» (который будет содержать первые 2 части IP-адреса), а затем соответствовать THAT с помощью = on соединение. Оттуда между ними может работать работа между ними. Вам нужно будет разделить свой IP на (256 * 256), чтобы получить первые 2 части вашего IP-адреса, а затем сопоставить их с диапазонами на an = ... но он ДЕЙСТВИТЕЛЬНО зависит от того, какие диапазоны у вас есть в этой второй таблице , – Patrice

Смежные вопросы