将数据库一个表的两列数据合并且去重

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将数据库一个表的两列数据合并且去重相关的知识,希望对你有一定的参考价值。

在不同的数据库有不同的方法:
mysql中是使用concat(str1,str2,...).
例:
select
concat('my',
's',
'ql');
结果:mysql
oracle
使用||号.
select
'abc'
||
'def'
from
dual;
结果:adbdef
一般情况下,我们将由不同栏位获得的资料串连在一起,每一种资料库都有提供方法来达到这个目的:
mysql:
concat()
oracle:
concat(),
||
sql
server:
+
其实对于非程序员,可以利用excel或是access搞定。
在excel表格中就可以实现:
d1=concatenate(a1,b1,c1);或是
d1=
a1&b1&c1。
在access中,d=[a]&[b]&[c].
参考技术A SELECT
TABLE.A
FROM
nammm5
UNION
SELECT
TABLE.B
FROM
nammm5;
===============-==================-======
这是一句整的SQL语句。
如果把UNION改为UNION
all,,那么将出现6行了。

将数据从一列插入另一个表的两列的过程

【中文标题】将数据从一列插入另一个表的两列的过程【英文标题】:Procedure to insert data from one column into two columns in another table 【发布时间】:2014-04-19 05:31:05 【问题描述】:

我正在尝试获取一个过程,该过程允许我从列中获取数据并将其插入到不同表中的两个不同列中。第一个表当前在单个列中同时包含名字和姓氏。我有另一个表,名字和姓氏在不同的列中,我需要将它们从 Column1/Table1 分离并插入到 Table2 的两列中,最好使用一个过程,因为我有很多名称要迁移。

表 1 中的 Column1(Name) 如下所示

     NAME          
First_Name1 Last_name1 

First_Name2 Last_Name2 

First_Name3 Last_Name3       

并且我需要使用第一个表中的数据将 Table2 中的数据像这样分隔为 FName/LName:

F_Name     |  L_Name

First_Name1|Last_Name1

First_Name2|Last_Name2

First_Name3|Last_Name3

我想出了如何从使用 SUBSTR 和 INSTR 分隔的姓氏和名字中获取数据,但我不知道如何将其放入过程中,或者如何循环它,因为我想使用它多行。

select substr(staff.name, 0, instr(staff.name, ' ')-1) as Fname
from staff;
select substr(staff.name, instr(staff.name,' ')+1) as Lname
from Staff;

有什么想法/帮助吗?谢谢大家。

【问题讨论】:

【参考方案1】:

为多个 DML 目标构建基于循环 PL/SQL 的 DML 游标

PL/SQL 存储过程是完成任务的好方法。将单个名称字段分解为 FIRST NAMELAST NAME 组件的另一种方法是使用 Oracle Regular Expression,如下所示:

SELECT REGEXP_SUBSTR('MYFIRST MYLAST','[^ ]+', 1, 1) from dual
-- Result: MYFIRST

SELECT REGEXP_SUBSTR('MYFIRST MYLAST','[^ ]+', 1, 2) from dual
-- Result: MYLAST

基于过程的方法是个好主意;首先将此查询包装到游标定义中。将游标集成到完整的 PL/SQL 存储过程 DDL 脚本中。

CREATE or REPLACE PROCEDURE PROC_MYNAME_IMPORT IS

    -- Queries parsed name values from STAFF (the source) table 

    CURSOR name_cursor IS
       SELECT REGEXP_SUBSTR(staff.name,...) as FirstName,
              REGEXP_SUBSTR(... ) as LastName
         FROM STAFF;

    BEGIN

       FOR i IN name_cursor LOOP
          
          --DML Command 1:
          INSERT INTO Table_One ( first_name, last_name )
          VALUES (i.FirstName, i.LastName);
          COMMIT;

          --DML Command 2:
          INSERT INTO Table_Two ...
          COMMIT;

          END LOOP;

    END proc_myname_import;

正如您从示例块中看到的那样,对于给定的游标记录及其值,可以执行一长串 DML 语句(不仅仅是两个),因为它由每个循环迭代处理。每个字段都可以通过在游标 SQL 语句中分配给它们的名称来引用。有一个“。” (点)表示法,其中分配给光标调用的句柄是前缀,如:

CURSOR c1 IS
   SELECT st.col1, st.col2, st.col3
     FROM sample_table st
    WHERE ...

然后游标调用循环遍历主记录集:

FOR my_personal_loop IN c1 LOOP
    ...do this
    ...do that

    INSERT INTO some_other_table (column_one, column_two, column_three)
    VALUES (my_personal_loop.col1, my_personal_loop.col2, ...);

    COMMIT;
END LOOP;

... and so on.

【讨论】:

这解释了我正在尝试做的很多事情,您甚至深入了解了如何使用光标。非常感谢! 很高兴能帮上忙!光标是很好的通用结构。在我的示例中,我使用了不需要发出 FETCH 命令或一些循环检查机制来保持光标打开的符号样式。 (例如 %ISOPEN)【参考方案2】:

这应该适合你。

insert into newtable(FirstName, LastName)
  select substr(staff.name, 0, instr(staff.name, ' ') - 1),
         substr(staff.name, instr(staff.name, ' ') + 1)
    from staff;

【讨论】:

以上是关于将数据库一个表的两列数据合并且去重的主要内容,如果未能解决你的问题,请参考以下文章

将数据从一列插入另一个表的两列的过程

合并数据透视表中的两列

尝试合并两个不同数据框的两列时出现问题?

将数据框中的两列或多列合并为具有新名称的新列

怎样一个表中的2个查询结果合并到一个表中的两列

两个表,一个表中的两列关联另一个表的id,如何将这个表中的两列显示为另一个表id对应的内容