我有一个表MAINID字段上有重复项,如下所示:

ID      SYSTEM  FLAG  FIRST_NAME   LAST_NAME       TERMDATE
A021    Alpha   Y     JOHN         DOE             null
A021    Beta    N     JOHN         DOE             05-Jun-17
C045    Beta    Y     PETER        PARKER          null
C045    Omega   N     PETER        PARKER          05-Jan-17
D078    Alpha   N     TONY         STARK           07-Dec-17
D078    Gamma   Y     TONY         STARK           null
X039    Gamma   Y     STEVE        ROGERS          null
X039    Gamma   Y     STEVE        ROGERS          null

如您所见,我在id字段中有重复项。我想在主表中保留空数据的记录,并将其他记录移到重复的表中。所以我希望主表的输出如下所示:
ID      SYSTEM  FLAG  FIRST_NAME   LAST_NAME       TERMDATE
A021    Alpha   Y     JOHN         DOE             null
C045    Beta    Y     PETER        PARKER          null
D078    Gamma   Y     TONY         STARK           null
X039    Gamma   Y     STEVE        ROGERS          null

副本应该移动到一个副本表中,该表应该如下所示:
ID      SYSTEM  FLAG    FIRST_NAME  LAST_NAME      TERMDATE
A021    Beta    N     JOHN          DOE            05-Jun-17
C045    Omega   N     PETER         PARKER         05-Jan-17
D078    Alpha   N     TONY          STARK          07-Dec-17

需要注意的是,完全重复的记录没有移动到重复表E.X.X039,将被完全删除,并且不会移动到重复表。
我找不到能达到这个效果的剧本。

最佳答案

还有一个选择:
表格内容:

SQL> select * From main order by id;

ID    SYSTEM     F FIRST_NAME TERMDATE
----- ---------- - ---------- ----------
a021  alpha      y john
a021  beta       n john       05.06.2017
c045  beta       y peter
c045  omega      n peter      05.01.2017
d078  alpha      n tony       07.12.2017
d078  gamma      y tony
x039  gamma      y steve
x039  gamma      y steve

8 rows selected.

重复项:在同一个id内按termdate排序。将它们插入重复项并从main中删除。你不能只是“移动”它们(从这里拿出来放在那里;你必须分两步来完成):
SQL> insert into duplicate
  2  select id, system, flag, first_name, termdate
  3  from  (select id, system, flag, first_name, termdate,
  4           rank() over (partition by id order by termdate nulls first) rn
  5         from main
  6        )
  7  where rn > 1;

3 rows created.

SQL> delete from main
  2  where (       id, system, flag, first_name, termdate) in
  3        (select id, system, flag, first_name, termdate
  4         from duplicate
  5        );

3 rows deleted.

最后,从main中删除剩余的副本:
SQL> delete from main m
  2  where exists (select null from main m1
  3                where m1.id = m.id
  4                  and m1.rowid > m.rowid
  5               );

1 row deleted.

结果是:
SQL> select * From main order by id;

ID    SYSTEM     F FIRST_NAME TERMDATE
----- ---------- - ---------- ----------
a021  alpha      y john
c045  beta       y peter
d078  gamma      y tony
x039  gamma      y steve

SQL>
SQL> select * from duplicate order by id;

ID    SYSTEM     F FIRST_NAME TERMDATE
----- ---------- - ---------- ----------
a021  beta       n john       05.06.2017
c045  omega      n peter      05.01.2017
d078  alpha      n tony       07.12.2017

SQL>

关于sql - 将重复的记录移到另一个表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49414866/

10-10 21:43
查看更多