【问题标题】:Oracle 11g: selecting all rows within 2 valuesOracle 11g:选择 2 个值内的所有行
【发布时间】:2018-06-13 14:11:11
【问题描述】:

我有 2 张桌子:

表 L

FROM | TO  | A     | B  
-----+-----+-------+-------
1    | 10  | bla1  | more1
11   | 20  | bla2  | more2
..   | ..  | ..    | ..

FROM - TO 界定一系列值(此处为 1-10、11-20 等)

表 S

VAL  | X     | Y
-----+-------+------
1    | foo1  | bar1
2    | foo2  | bar2
..   | ..    | ..
15   | foo15 | bar15
..   | ..    | ..

等等

我想从这两个表中填充一个表R,如下所示:

表 R

VAL  | X    | Y     | A     | B  
-----+------+-------+-------+-----
1    | foo1 | bar1  | bla1  | more1
2    | foo2 | bar2  | bla1  | more1
..   | ..   | ..
15   | foo15| bar15 | bla2  | more2
..   | ..   | ..

业务逻辑

对于 S 的每一行,将 S.VALS.XS.Y 以及 L.AL.B 对应的值插入到 R 中。 对应的值由L.FROM <= S.VAL <= L.TO 定义。

问题

有人可以建议在 SQL(理想情况下)或 PL/SQL 中实现这一目标的方向吗?

【问题讨论】:

    标签: sql plsql oracle11g


    【解决方案1】:

    至少假设范围不重叠,您的解释中几乎已经得到了答案;用逻辑L.FROM <= S.VAL <= L.TO 连接两个表,作为连接条件变成了

    L.FROM <= S.VAL AND S.VAL <= L.TO
    

    因此,您可以使用具有该连接条件的查询获得insert ... select ...

    insert into r (val, x, y, a, b)
    select s.val, s.x, s.y, l.a, l.b
    from s
    join l on l."FROM" <= s.val and s.val <= l."TO"
    

    希望您的列并没有真正称为“来自”和“至”,但我使用了带引号的标识符以防万一。

    或者,您可以使用该查询将R 设为视图,而不是使用冗余数据单独维护的表。


    您可以改用between,如:

    join l on s.val between l."FROM" and l."TO"
    

    但这是在引擎盖下翻译成

    join l on s.val >= l."FROM" and s.val <= l."TO"
    

    这是相同的逻辑,我更喜欢扩展形式,因为它更清晰,更明确。

    【讨论】:

    • 谢谢。很好的答案(并提出了观点)。标记为正确并投票赞成!
    • 有没有办法为 S 和 L 使用别名?
    • @HeyStackExchange - 不确定你的意思。你可以做select s.val ... from long_name l join some_other_name s on s.val ...。不过,这只是普通的表别名......
    • 谢谢,这就是我要找的别名
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2013-08-07
    • 2012-01-21
    • 2016-05-21
    • 2017-12-07
    • 2020-10-18
    • 2021-01-07
    相关资源
    最近更新 更多