我怎么能把它放在一个查询中,关键是当按名称对艺术家分组时,我需要考虑artist中的所有行,但如果artist_nodup表中已经有行,我不想将其保留在mbartist_discogsartist表中。(我用的是Postgres9.3)

INSERT INTO artist_nodup
SELECT
min(a1.id) as id,
a1.name
FROM artist  a1
GROUP BY a1.name
HAVING COUNT(*)=1
;

DELETE
FROM artist_nodup T1
WHERE exists
( select 1
   from mbartist_discogsartist T2
  where t1.id = t2.discogs_id
)
;

最佳答案

如果它足以避免INSERT中的冗余行,也不需要从artist_nodup中删除先前存在的行:

INSERT INTO artist_nodup
SELECT a.id, a.name
FROM   artist a
LEFT   JOIN artist a2 ON a2.name = a.name AND a2.id <> a.id
LEFT   JOIN mbartist_discogsartist m ON m.discogs_id = a.id
WHERE  a2.name IS NULL
AND    m.discogs_id IS NULL;

第一LEFT JOIN排除了来自的行,其中其他行以相同的名称存在。
第二artist排除了从LEFT JOIN中出现的行,其中在artist中存在匹配的ID(替换后来的mbartist_discogsartist)。
DELETE是实现此目的的两种技术之一:
Select rows which are not present in other table
如果您还想排除LEFT JOIN / IS NULL中预先存在的行:
...
LEFT JOIN artist_nodup an ON an.name = a.name
...
AND an.name IS NULL

你拿到钻头。。。

关于sql - 我可以将此INSERT和DELETE查询放入单个INSERT查询中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29012333/

10-15 21:04