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

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

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

  1. asscssn | count(*)
  2. --------- --------
  3. 123456789 8
  4. 987654321 5
  5. 234567890 5

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

  1. asscid | asscssn
  2. ------ -------
  3. 53492 987654321
  4. 53365 987654321
  5. 53364 987654321
  6. 52104 987654321
  7. 50185 987654321

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

  1. docketnumber | asscid
  2. ----------- -------
  3. 2010JV0000 53492
  4. 2010JV1111 53365
  5. 2010JV2222 53364
  6. 2010JV3333 52104
  7. 2010JV4444 50185

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

  1. docketnumber | asscid
  2. ----------- -------
  3. 2010JV0000 53492
  4. 2010JV1111 53492
  5. 2010JV2222 53492
  6. 2010JV3333 53492
  7. 2010JV4444 53492
2eafrhcq

2eafrhcq1#

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

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

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

  1. update cases c
  2. set assc_id = (select max_asscid
  3. from (select a.*, max(asscid) over (partition by asscssn) as max_asscid
  4. from associations a
  5. where asscssn is not null
  6. ) a
  7. where a.asscid = c.asscid
  8. );
展开查看全部
disbfnqx

disbfnqx2#

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

  1. select
  2. docketnumber,
  3. q.asscid
  4. from table2
  5. cross join
  6. (
  7. select
  8. max(asscid) as asscid
  9. from table1
  10. ) q

输出:

  1. | docketnumber | asscid |
  2. | ------------ | ------ |
  3. | 2010JV0000 | 53492 |
  4. | 2010JV1111 | 53492 |
  5. | 2010JV2222 | 53492 |
  6. | 2010JV3333 | 53492 |
  7. | 2010JV4444 | 53492 |
展开查看全部
r6vfmomb

r6vfmomb3#

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

  1. update cases c
  2. set asscid = (
  3. select max(a1.asscid)
  4. from associates a
  5. inner join associates a1 on a1.asscssn = a.asscssn
  6. where a.asscid = c.asscid
  7. )

也可以使用窗口功能:

  1. update cases c
  2. set asscid = (
  3. select max_asscid
  4. from (
  5. select asscid, max(asscid) over(partition by asscssn) max_asscid
  6. from associates
  7. ) a
  8. where a.asscid = c.asscid
  9. )

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

  1. DOCKETNUMBER | ASSCID
  2. :----------- | -----:
  3. 2010JV0000 | 53492
  4. 2010JV1111 | 53492
  5. 2010JV2222 | 53492
  6. 2010JV3333 | 53492
  7. 2010JV4444 | 53492
展开查看全部

相关问题