【问题标题】:SQL Search for missing record, then insert valueSQL 搜索缺失的记录,然后插入值
【发布时间】:2020-06-19 15:56:19
【问题描述】:

下面是我试图解决的一个非常简单的问题

我有以下表格:

**quiz**

id   title  
--------------
1   first
2   second
3   third
4   fourth
5   fifth

**quiz_status**

id   status   user_id   quiz_id 
-------------------------------
1      0         1         1
2      0         1         2
3      0         1         3

如果我运行以下命令:

select * 
from quiz as q
left join quiz_status as qs
ON q.id = qs.quiz_id 
where qs.user_id=1

我会得到:

id   title  id   status   user_id   quiz_id
-------------------------------------------
1   first   1      0         1         1
2   second  2      0         1         2
3   third   3      0         1         3
4   fourth  null   null      null      null
5   fifth   null   null      null      null

我希望能够在 quiz_status 表中的缺失/空值处插入值。

所以最终的结果是:

id   title  id   status   user_id   quiz_id
-------------------------------------------
1   first   1      0         1         1
2   second  2      0         1         2
3   third   3      0         1         3
4   fourth  4      0         1         4
5   fifth   5      0         1         5

插入语句会是什么?

【问题讨论】:

    标签: sql postgresql join select sql-insert


    【解决方案1】:

    考虑insert ... select 语法:

    insert into quiz_status(status, user_id, quiz_id)
    select 0, u.user_id, q.id
    from (select distinct user_id from quiz_status) u
    cross join quiz q
    left join quiz_status qz on q.id = qz.quiz_id and u.user_id = qz.user_id
    where qz.quiz_id is null
    

    这通过生成用户和测验的所有组合,然后left joining 状态表来过滤缺失的记录。在现实生活中,您可能会使用一个 users 表来代替 select distinct 子查询。

    如果您只需要一个用户,那就更简单了:

    insert into quiz_status(status, user_id, quiz_id)
    select 0, 1, q.id
    from quiz q
    left join quiz_status qz on q.id = qz.quiz_id and qz.user_id = 1 
    where qz.quiz_id is null
    

    注意:大概id 是一个串行列,所以我把它放在inserts 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多