查询更新表与其他表进行比较,如果不存在则删除

时间:2018-01-24 22:16:36

标签: sql postgresql

我正在努力在Postgres中进行查询,让我解释一下:

我想用其他名为 users_temp 的表中的新用户更新表用户。此 users_temp 包含来自我的电报频道的最新用户。困难的部分:我希望如果 users_temp 表中有新用户,它会被添加到我的用户表中,如果我有任何用户在< strong>用户表格但不在 users_temp 内,我想从用户中删除它。 BTW识别用户,它是一个简单的用户ID&#39;列。

是否可以在单个查询中执行此操作?我试过MERGE,UNIONS,但是只能用一个查询找不到出路。此外,由于线路数量众多,我需要查询相对较快。

由于

3 个答案:

答案 0 :(得分:3)

您可以在单个查询中插入和更新,但在单个查询中不可能 INSERT和DELETE。

您可以执行的操作是在一个交易中插入和删除:

BEGIN TRANSACTION

    INSERT INTO nu
      SELECT nu.*
      FROM new_users nu
      LEFT JOIN Users u ON u.UserId=nu.UserId
      WHERE u.UserId IS NULL;

    DELETE FROM Users WHERE UserId NOT IN (SELECT UserID FROM new_users);

COMMIT

如果您尝试从客户端应用程序发出此命令,通常可以将一个长字符串作为单个命令发送到数据库。

另一种方法是执行软删除,只需使用MERGE查询的UPDATE端将记录标记为已删除。这可能允许您编写触发器,然后删除记录。

答案 1 :(得分:0)

Marging可以在单个查询中完成,但您首先要准备转移表。

创建users表的副本:

create table users_copy as select * from users;

删除users

中的所有行
truncate users;

最后:

insert into users select users_temp.* from users_temp LEFT OUTER JOIN copy_of_users on users_temp.userId=copy_of_users.users_temp;

答案 2 :(得分:0)

解决了两个问题:

delete from users as u where not exists (select 1 from users_temp where u.userId = users_temp.userId)

insert into users (userId,username) select t.userId,t.username from users_temp t on conflict (userId) do nothing

感谢您的帮助!