oracle用另一个表中的值删除重复项并更新表中的行

roejwanj  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(356)

在我的associates表中,我有4978人,其中至少有一个重复。

asscssn     | count(*)
---------     --------
123456789      8
987654321      5
234567890      5

一个人的每个副本在associates表中都有一个唯一的id(asscid)。

asscid | asscssn
------  -------
53492    987654321
53365    987654321
53364    987654321
52104    987654321
50185    987654321

我的案情表上每个混蛋都有一个案子

docketnumber | asscid
-----------    -------
2010JV0000     53492
2010JV1111     53365
2010JV2222     53364
2010JV3333     52104
2010JV4444     50185

我想采取每个人,有一个重复,抓取最新的asscid的人从协会表,并更新案件表。结果将是:

docketnumber | asscid
    -----------    -------
    2010JV0000     53492
    2010JV1111     53492
    2010JV2222     53492
    2010JV3333     53492
    2010JV4444     53492
2eafrhcq

2eafrhcq1#

如果我理解正确,您需要:

select c.docketnumber, max_asscid
from cases c join
     (select a.*, max(asscid) over (partition by asscssn) as max_asscid
      from associations a
     ) a
     on c.asscid = a.asscid;

这假设“最新的” asscid 是价值最大的那个。如果有另一列指定排序(如日期),则可以使用 first_value() 相反。
编辑:
如果确实要更新数据:

update cases c
    set assc_id = (select max_asscid
                   from (select a.*, max(asscid) over (partition by asscssn) as max_asscid
                         from associations a
                         where asscssn is not null
                        ) a
                   where a.asscid = c.asscid
                  );
disbfnqx

disbfnqx2#

你可以用 cross join 得到最新消息后 asscid . 这是演示。

select
    docketnumber,
    q.asscid
from table2
cross join
(
  select
    max(asscid) as asscid
  from table1
) q

输出:

| docketnumber | asscid |
| ------------ | ------ |
| 2010JV0000   | 53492  |
| 2010JV1111   | 53492  |
| 2010JV2222   | 53492  |
| 2010JV3333   | 53492  |
| 2010JV4444   | 53492  |
r6vfmomb

r6vfmomb3#

我知道你在找一个 update 声明-到目前为止没有其他答案提供。
的语法 update 查询往往相当特定于每个数据库。既然已经澄清了您使用的是oracle,我建议使用一个相关的子查询。
你可以自己加入 associates 表格:

update cases c
set asscid = (
    select max(a1.asscid) 
    from associates a
    inner join associates a1 on a1.asscssn = a.asscssn
    where a.asscid = c.asscid
)

也可以使用窗口功能:

update cases c
set asscid = (
    select max_asscid
    from (
        select asscid, max(asscid) over(partition by asscssn) max_asscid
        from associates
    ) a
    where a.asscid = c.asscid
)

db fiddle上的演示:在 update 执行查询时 cases 表包含:

DOCKETNUMBER | ASSCID
:----------- | -----:
2010JV0000   |  53492
2010JV1111   |  53492
2010JV2222   |  53492
2010JV3333   |  53492
2010JV4444   |  53492

相关问题