2016-12-16 3 views
2

У меня есть таблица под названием ranges, которая выглядит как this-SQL - как выбрать строки на основе значений из другой таблицы?

create table ranges(low bigint, high bigint, id int); 
insert into ranges values (10,20,100); 
insert into ranges values (21,30,101); 

Я еще одну таблицу, которая выглядит как this-

create table ip(ip bigint); 
insert into ip values (12); 

Я хочу запрос, который будет выводить id из ranges таблица, если ip от ip таблица находится между low ииз ranges стол.

Например, для ф 12, я хочу выход быть -

12,100

так 12 находится между низким и высоким 1020 из ranges таблицы. Каков наиболее эффективный способ сделать это? столбец ip не существует в таблице ranges, поэтому я не могу выполнить прямое соединение.

ответ

3

Вы можете присоединиться к таблице, используя диапазон.

SELECT 
    ip.ip, ranges.id 
FROM 
    ip 
JOIN ranges ON ip.ip BETWEEN ranges.low AND ranges.high 
+0

Хотя он работает, на RedShift он очень медленный. Я получаю предупреждение: «Вложенная петля Присоединиться к плану запроса - просмотрите предикаты соединения, чтобы избежать декартовых произведений» – user375868

+0

Правильно, соединение, подобное этому, не рекомендуется в большой таблице. В качестве альтернативы, если в диапазонах есть регулярный интервал. Вы можете округлить свой 'ip.ip' до ближайшей базы интервала и сделать' JOIN'. – ydoow

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