【问题标题】:Merging two tables into one in Oracle SQL在 Oracle SQL 中将两个表合并为一个
【发布时间】:2015-05-27 20:23:51
【问题描述】:

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

表 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

这是一个例子:

答:

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;

【问题讨论】:

    标签: sql oracle merge


    【解决方案1】:

    假设您的查询有效,您只需要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;
    

    【讨论】:

    • 谢谢!那做了我想要的。这是最有效的方法吗?这些表中可能有 1000 多条记录。
    • @user2217874 。 . .如果您想要效率,请将数字存储为数字而不是字符串。但我不会担心几千条记录,除非您的计算机使用时间超过 15 年。
    猜你喜欢
    • 2016-01-23
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多