sql - Oracle SQL 中将两张表合并为一张

标签 sql oracle merge

我有两个表,每个表都有很多属性。每个属性都有我想要的属性,我正在尝试编写一个查询来获取这些属性,并将它们放入三列中。

表A

LOCATION_NUMBER (varchar2(20Byte)), 
BEGIN (NUMBER (3,0)), 
BEGIN_DEC (NUMBER (4,3)), 
END (NUMBER (3,0)), 
END_DEC (NUMBER (4,3))

表B
LOCNUM (NUMBER (15,0)), 
START (VARCHAR2(6 BYTE)), 
START_POS (NUMBER (5,3)), 
FINISH (VARCHAR2 (6 BYTE)), 
FINISH_POS (NUMBER (5,3)).

我从查询中想要的是一个表,具有三个属性,然后首先按位置对这些表进行排序,然后再开始。

表 C,
LOCATION, 
START, 
END

下面是一个例子:

A:
LOCATION_NUMBER    BEGIN    BEGIN_DEC    END    END_DEC
      I 26          8          0.63       13      0.99
      I 32          144        0          151     0.82
      I 35          22         0.29       55      0.09
      I 35          128        0.1        67      0.9
      I 35          0          0          22      0.28        

乙:
LOC_NUM            START    START_POS    FINISH  FINSIH_POS
      227           98         0.56       100     0
      35            149        0.25       151     0.55
      96            156        0.23       156     1.26
      11            263        2.56       263     4.52

结果集:
LOCATION       START        END
    26          8.63         13.99
    32          144          151.82
    35          22.29        55.09
    35          128.1        67.9
    35          0            22.28   
    227         98.56        100
    35          149.25       151.55
    96          156.23       157.26
    11          265.56       267.52

我有一些我尝试过的查询 我能够从每个表中获得所需的结果,我只需要知道如何将它们组合成一个以使我想要的表更容易,同样,每个表都有 10 - 还有 20 个我不想担心的属性。
Select to_number(trim(regexp_substr(A.LOCATION_NUMBER ,'[^ ]+', 1, 2))) AS LOCATION,
(to_number(trim(A.BEGIN)) + to_number(trim(A.BEGIN_DEC))) AS START,
(to_number(trim(A.END)) + to_number(trim(A.END_DEC))) AS END
FROM A
ORDER BY to_number(trim(regexp_substr(A.LOCATION_NUMBER,'[^ ]+', 1, 2)));

SELECT B.LOC_NUM AS LOCATION,
(to_number(trim(B.START)) + to_number(trim(B.START_POS))) AS START,
(to_number(trim(B.FINISH)) + to_number(trim(B.FINISH_POS))) AS END
FROM B
ORDER BY B.LOCATION, START;

最佳答案

假设您的查询有效,您只需要 union all :

Select to_number(trim(regexp_substr(A.LOCATION_NUMBER ,'[^ ]+', 1, 2))) AS LOCATION,
       to_number(trim(A.BEGIN)) + to_number(trim(A.BEGIN_DEC)) AS START,
       to_number(trim(A.END)) + to_number(trim(A.END_DEC)) AS END
FROM A
UNION ALL
SELECT B.LOC_NUM AS LOCATION,
       to_number(trim(B.START)) + to_number(trim(B.START_POS)) AS START,
       to_number(trim(B.FINISH)) + to_number(trim(B.FINISH_POS)) AS END
FROM B
ORDER BY B.LOCATION, START;

关于sql - Oracle SQL 中将两张表合并为一张,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29234083/

相关文章:

mysql - 将列转换为行并获取最新值

mysql - 如果 COUNT() 没有返回,则打印零

oracle - 为什么从 Dual 中选择 123456.123456789123456;返回 123456.123457?

sql - Oracle 11.2.0.2.0 中的日期比较问题

sql - 会通过保留订购吗?

c - C 中文本文件的合并和排序

sql - T-SQL - 范围内的过滤日期

sql - 根据一列的 MAX 和另一列的相关 MIN 选择行

将另一个数据框中的列名称替换为 R 中缺少的列名称?

git - 如何使 Gitlab runner 将代码 merge 到成功构建的分支中