此表格代表音乐曲目中的艺术家,位置指定艺术家的顺序, join_relation 指定要在艺术家之间插入的文字,例如'& ;”或','创建 artistcredit
table "tracks_artists"
Column | Type | Modifiers
---------------+---------+-----------
track_id | text | not null
position | integer | not null
name | text |
join_relation | text |
因此,如果我们在名称
中有这些行track_id | position | name | join_relation
--------------------------------------------------------------------+--------------
f559fe60-cf21-4019-9395-7bdde3256be1 | 1 | Elec3 | &
f559fe60-cf21-4019-9395-7bdde3256be1 | 2 | Psynina |
artistcredit将是 Elec3& Pysnina
但在某些情况下由于导入数据无效,我们有一个所有行的连接关系的值
track_id | position | name | join_relation
--------------------------------------------------------------------+--------------
f559fe60-cf21-4019-9395-7bdde3256be1 | 1 | Elec3 | &
f559fe60-cf21-4019-9395-7bdde3256be1 | 2 | Psynina | ,
即这将给予 Elec3& Pysnina,
但这是错误的,因为最高位置艺术家不应该具有join_relation列的值
如何修复此表,以便任何轨道的最高阶艺术家都将relation_join设置为null。如果它更容易,我不介意在多个阶段这样做。
我正在使用Postgres 9.3.5
更新 根据下面的答案进入分阶段,首先找到问题行
create temp table badjoins as
select t1.* from tracks_artists t1
where
( t1.join_relation is not null AND t1.join_relation!='')
AND NOT EXISTS
(
SELECT 1 FROM tracks_artists t2 WHERE t1.track_id = t2.track_id
AND t2.position > t1.position
);
答案 0 :(得分:1)
也许这个?
UPDATE tracks_artists t1 SET join_relation = NULL WHERE NOT EXISTS (SELECT 1 FROM track_artists t2 WHERE t1.track_id = t2.track_id AND t2.position > t1.position)