SQL Поиск пропущенной записи, затем вставьте значение - PullRequest
1 голос
/ 07 марта 2020

Ниже приведена очень упрощенная проблема, которую я пытаюсь решить

У меня есть следующие таблицы:

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

, поэтому окончательный результат будет be:

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

Каким будет оператор вставки для этого?

1 Ответ

0 голосов
/ 07 марта 2020

Рассмотрим синтаксис 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 join с использованием таблицы состояния для фильтрации по отсутствующим записям. В реальной жизни у вас, скорее всего, будет таблица 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 - это последовательный столбец, поэтому я оставил его отдельно в insert s.

...