我有两个oracle表。
表A
| 金额|
| --------------|
| 两百|
| 五百|
| 一百|
表B
| 金额来源|金额至|批准人|
| --------------|--------------|--------------|
| - 一百|四九九|批准人1|
| 四百九十九|一千|批准人2|
| -50|三百|批准人3|
如果Oracle SQL从表A返回值200,那么它应该从表2中获取第一行(-100和499),从表A返回值500,那么它应该从表2中获取第二行(-499和1000),从表A返回值100,那么它应该从表2中获取第三行(-50和199)。
如果amount福尔斯amount_from & amount_to之间,其中最小,那么我需要找到相应的批准者。
3条答案
按热度按时间ldfqzlk81#
在Oracle 12中,您可以使用
LATERAL
连接并返回第一个匹配的行。其中,对于样本数据:
输出:
| 金额|批准人|
| --------------|--------------|
| 两百|批准人3|
| 五百|批准人2|
| 一百|批准人3|
如果Oracle SQL从表A返回值200,那么它应该从表2中获取第一行(-100和499),从表A返回值500,那么它应该从表2中获取第二行(-499和1000),从表A返回值100,那么它应该从表2中获取第三行(-50和199)。
在SQL(在任何方言中,不仅仅是Oracle的SQL方言)中,没有“第一”或“第二”行的概念,除非您指定
ORDER BY
子句并可以定义结果集的确定性排序。在这种情况下,你说你想要:
如果金额福尔斯
amount_from
和amount_to
之间,这是最小的,那么我需要找到相应的批准人。“最小”可以是最小的
amount_from
或最小的amount_to
或amount_from
和amount_to
之间的最小范围;我选择了最后一个度量,范围,但您同样可以实现任何其他度量来确定什么是“最小”。fiddle
u5i3ibmn2#
严格按照你的“要求”,我会做上面的事情。尽管如此,就像同事们提到的那样,这是一个最不寻常的数据库设计。表应该有主键。最后是外键。我没有看到table_b的任何主键。数量区间看起来很奇怪,因为它们彼此相交-这是我在任何地方都没有看到的。..通常那些间隔不相交。
ekqde3dh3#
其中一个选项是使用解析函数Min()Over()建立表连接: