sql - 我可以将此 INSERT 和 DELETE 查询放入单个 INSERT 查询中吗

标签 sql postgresql insert duplicates

我如何将其放入一个查询中,关键是当按名称对艺术家进行分组时,我需要考虑 artist 中的所有行,但我不想保留 中的行>artist_nodup 表,如果它已经在 mbartist_discogsartist 表中。 (我正在使用 Postgres 9.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 排除 artistmbartist_discogsartist 中存在匹配 id 的行(替换/strong> 后面的 DELETE).

LEFT JOIN/IS NULL 是执行此操作的几种技术之一:

如果您还想排除 artist_nodup 中预先存在的行:

...
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/

相关文章:

sql - 在 Postgres 的索引处的 SELECT 上插入数组

Mysql触发器更新如果日期匹配和插入如果不匹配所有之前插入

mysql - 尝试理解 MySQL 和关系代数中复杂 SQL 查询的逻辑

sql - 可以选择组是否包含一个元素(postgresql)

mysql - SQL 将值拆分为多行

postgresql - 无法连接到数据库 : Loopback + Heroku + Postgres: ECONNREFUSED 127. 0.0.1:5432

spring - 在 Spring Boot JPA 中映射枚举和时间类型

jquery - 将 HTML 插入 iframe

c# - 从数据库中的二进制文件写入 PDF

java - Android list 不启动 Activity