Oracle 11g:选择2个值中的所有行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 11g:选择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.VAL
,S.X
和S.Y
插入R,以及L.A
和L.B
对应的值。通过使用L.FROM <= S.VAL <= L.TO
定义相应的值。
题
有人可以建议在SQL(理想情况下)或PL / SQL中实现这一目标吗?
答案
你的解释中几乎得到了答案,至少假设范围没有重叠;用逻辑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"
这是相同的逻辑,我更喜欢扩展形式,因为它更清晰,更明确包容。
以上是关于Oracle 11g:选择2个值中的所有行的主要内容,如果未能解决你的问题,请参考以下文章