2016-12-16 23 views
2

私は、クエリをthis-SQL - 別のテーブルの値に基づいて行を選択する方法は?

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

のように見える別のテーブルを望んできましたthis-

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

のように見えますrangesと呼ばれるテーブルをしましたrangesからの出力するであろうidipipテーブルがlowhighrangesテーブルの間にある場合12rangesテーブルからロー10と高20の間にあるので、

12,100

- 例えば

は、IP 12のために、私は出力になりたいです。これを行う最も効率的な方法は何ですか?列iprangesテーブルに存在しないため、簡単な結合はできません。

答えて

3

範囲を使用してテーブルに参加することができます。

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

RedShiftでは動作しますが、非常に遅いです。私は警告になっています - 'ネストされたループ結合はクエリプランにあります - 結合述語を参照してデカルト積を避ける' – user375868

+0

右、このような結合は大きなテーブルではお勧めできません。あるいは、 'ranges'に定期的な間隔がある場合。 'ip.ip'を最も近い間隔の基数に切り上げて' JOIN'を実行することができます。 – ydoow