Postgres使用select语句更新重复项

时间:2016-09-05 06:53:58

标签: sql postgresql

我有一个表,主键是唯一的,但是具有重复值的辅助列。其他表使用此主键进行链接。

我想在列不为空的所有表中基于辅助列合并重复值,如果可能的话,最好的方法也是如此。

表1

- T1Column1(PrimaryKey)
- T1Column2 ( have duplicate values )

表2

- T2Column1 (primaryKey)
- T2Column2 (Some column)
- T2Column3 (Table 1 Primary Key)

不确定我问的是否清楚。

使用表1中包含重复项的表1合并所有值(如果它们不为空)。

示例

--Retrieve all values that have duplicates . Note Primary Is not a duplciate but i need rsaid to be unique
for r in
    select * from  importedcase where id in ( select max(id) from importedcase
    group by rsaid having count(*) > 1) order by id 
loop

    -- second loop is to merge or update the tables and then will delete the old data
    for rs in
        select * from importedcase where rsaid = r.rsaid
        group by rsaid having count(*) > 1 order by id 
    loop
        --UPDATE all tables using 
    end loop;
end loop;

这个例子是我认为应该发生的但不确定如何实现目标。 注 - 从表1中获取将用于合并或更新的最大ID,然后删除其他的

表和列

importedcase
id - rsaid - c3 - c4

1  - 1111  - Test  - ''
2  - 1111  - ''    - foo
3  - 1231  - ''    - ''

secondtable
id - importedcase_id - column3 - column 4

1  -   1  -  somedate   -  hasdata
2  -   2  -  test       - ''
3  -   3  -  foo        - ''

我的结果应该是让导入的case中的rsaid是唯一的我想用导入的case中的max id更新第二个表以及如果它不为null则使用数据

结果可能看起来像这样

importedcase
id - rsaid - c3 - c4

2  - 1111  - Test - foo
3  - 1231  - ''    - ''

secondtable
id - importedcase_id - column3 - column 4

2  -   2  -  test       - hasdata
3  -   3  -  foo        - ''

1 个答案:

答案 0 :(得分:0)

通过左连接将表连接到自身会很有效。此外,确保右手主键更高或者你最终会得到太多。我还使用了一个带有MIN()函数的group by,因为你可能在那里有一些你不知道的地方,并且你将拥有2列。

select
min(t1.keyCol)
,t1.valueCol
,min(t2.keyCol)
from yourTable t1
left join yourTable t2
on t1.valueCol = t2.valueCol
and t1.keyCol < t2.keyCol
group by t1.valCol