多对多关系中的SQL默认值

多对多关系中的SQL默认值,sql,many-to-many,sql-insert,Sql,Many To Many,Sql Insert,我有以下多对多关系: user task user_task id| name id| name u_id| t_id --------- ----------- ---------- 1 | john 1 | default 1 | 2 2 | anna 2 | task2 现在,我想将默认任务分配给所有未分配任务的用户 我得到以下查询,该查询查找所有没有任务的用户: SELECT u.id, ut.t_i

我有以下多对多关系:

user        task           user_task

id| name    id| name       u_id| t_id
---------   -----------    ----------
1 | john    1 | default    1   | 2
2 | anna    2 | task2
现在,我想将默认任务分配给所有未分配任务的用户

我得到以下查询,该查询查找所有没有任务的用户:

SELECT u.id, ut.t_id FROM user u LEFT JOIN user_task ut ON (u.id = ut.u_id) LEFT JOIN task t ON (ut.t_id = t.id) WHERE ut.t_id is null;
此查询为我提供了默认任务的id:

SELECT id FROM task WHERE name='default';
但是如何将它们组合起来,将默认任务插入
user\u task
表中呢?结果应该是:

user        task           user_task

id| name    id| name       u_id| t_id
---------   -----------    ----------
1 | john    1 | default    1   | 2
2 | anna    2 | task2      2   | 1

您可以尝试此
INSERT。。选择
并交叉连接到
任务
表中的默认行,然后仅筛选未出现的用户是
用户任务

INSERT INTO user_task
SELECT u.id,t.id
FROM user u
CROSS JOIN task t
LEFT JOIN user_task ut
 ON(ut.u_id = u.id)
WHERE t.name = 'default'
  AND ut.u_id is null
试试这个:

INSERT INTO user_task (u_id, t_id)
SELECT u.id, t.id
FROM task AS t
CROSS JOIN (
  SELECT DISTINCT id
  FROM user) AS u
WHERE t.name = 'default' AND
      NOT EXISTS (SELECT 1
                  FROM user_task AS ut
                  WHERE ut.u_id = u.id)
上述查询使用
交叉联接
,以返回
用户
任务
的所有可能组合。
WHERE
子句过滤掉与默认任务无关的任何行。最后,
不存在
过滤掉已经分配任务的所有用户

尝试以下查询

DECLARE @DefaultTaskId INT = (SELECT TOP 1 id FROM task WHERE name='default')
INSERT INTO user_task
SELECT DISTINCT
    u_id,
    @DefaultTaskId
FROM 
    user u LEFT JOIN 
    user_task ut ON u.id = ut.u_id
WHERE
    ut.u_id IS NULL OR
    ut.t_id <> @DefaultTaskId
DECLARE @DefaultTaskId INT = (SELECT TOP 1 id FROM task WHERE name='default')
INSERT INTO user_task
SELECT
    u_id,
    @DefaultTaskId
FROM 
    user u 
WHERE
    NOT EXISTS
    (
        SELECT TOP 1 
            1
        FROM
            user_task ut
        WHERE
            ut.u.id = u.id AND
            ut.t_id = @DefaultTaskId
    )