【问题标题】:SQL - how to select rows based upon values from a different table?SQL - 如何根据来自不同表的值选择行?
【发布时间】:2016-12-16 00:05:15
【问题描述】:

我有一个名为ranges 的表,看起来像这样-

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

我还有一张像这样的桌子-

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

如果ip 表中的ip 介于lowranges 表的high 之间,我想要一个查询,它将从ranges 表中输出id

例如,对于 ip 12,我希望输出为 -

12,100

因为12 介于ranges 表中的低10 和高20 之间。这样做最有效的方法是什么? ip 列在 ranges 表中不存在,因此我无法进行直接连接。

【问题讨论】:

    标签: sql postgresql join


    【解决方案1】:

    您可以使用范围连接表格。

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

    【讨论】:

    • 虽然它可以工作,但在 RedShift 上却很慢。我收到警告-Nested Loop Join in the query plan - review the join predicates to avoid Cartesian products
    • 对,大表不推荐这样的join。或者,如果ranges 中有固定间隔。您可以将您的 ip.ip 舍入到最近的区间基数并执行 JOIN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2023-02-03
    相关资源
    最近更新 更多