sql - 使用选择和覆盖空值插入或更新

标签 sql sqlite upsert

我有两个表:默认表和具有相同列的用户,除了默认情况下,user_id列是唯一的,而在“ users”中则不是。

我想从用户那里获取所有行并将其插入默认值,如果用户中的两行都具有相同的user_id,我想以所有空/空值将被非空/空值覆盖的方式合并它们

这是一个例子

users
-----
user_id|name|email|address
--------------------------
1      |abc |null |J St
1      |coco|a@b.c|null


插入默认值后,我期望下一个结果:

defaults
-----
user_id|name|email|address
--------------------------
1      |abc |a@b.c|J St


@Eric B提供了如何使用插入值执行此操作的answer


假设表中有3列。.ID,NAME,ROLE
这将更新2个
列。当ID = 1时,角色将不受影响。当ID = 1时
不存在,该角色将设置为“ Benchwarmer”,而不是
默认值。


INSERT OR REPLACE INTO Employee (id, name, role) 
  VALUES (  1, 
            'Susan Bar',
            COALESCE((SELECT role FROM Employee WHERE id = 1), 'Benchwarmer')
          );


当我将select用于插入时如何执行此操作

insert or replace into defaults select ??? from users

最佳答案

INSERT OR REPLACE INT DEFAULTS VALUES (ID, Name, Role)
  (
    SELECT ID, MAX(Name), MAX(Role) FROM Users GROUP BY ID
  );


最大值将选择最大值,而不是null(如果有)。

关于sql - 使用选择和覆盖空值插入或更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38671127/

相关文章:

mysql - 在 while 循环中加入所有列

sql - 如何从 SQL 中的 DATETIME 列获取 DATE?

mysql - 将 MySQL 简单查询转换为 SQL Server

sql - 使用 sqldf 保留时间类

python - 用于多条 SQL 行的 f 字符串

mysql - 在 SQLite 中重新创建 MySQL 数据库

arrays - 在MongoDB文档中增加匹配条件的数组元素?

javascript - Sequelize js upsert 控制主键是否为空

php - 在 MYSQL INSERT 的 foreach 循环中向数组添加额外的值

postgresql - PostgreSQL UPSERT(可写 CTE)中使用一个表更新另一个表的不明确列