我正在努力在Postgres中进行查询,让我解释一下:
我想用其他名为 users_temp 的表中的新用户更新表用户。此 users_temp 包含来自我的电报频道的最新用户。困难的部分:我希望如果 users_temp 表中有新用户,它会被添加到我的用户表中,如果我有任何用户在< strong>用户表格但不在 users_temp 内,我想从用户中删除它。 BTW识别用户,它是一个简单的用户ID&#39;列。
是否可以在单个查询中执行此操作?我试过MERGE,UNIONS,但是只能用一个查询找不到出路。此外,由于线路数量众多,我需要查询相对较快。
由于
答案 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
感谢您的帮助!