Oracle 11g:选择2个值中的所有行

问题描述 投票:0回答:1

我有两张桌子:

表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插入R,以及L.AL.B对应的值。通过使用L.FROM <= S.VAL <= L.TO定义相应的值。

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

sql plsql oracle11g
1个回答
2
投票

你的解释中几乎得到了答案,至少假设范围没有重叠;用逻辑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"

希望你的专栏不是真的称为'from'和'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"

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

© www.soinside.com 2019 - 2024. All rights reserved.