SQL 多对多关系中的默认值
SQL default values in many-to-many relationship
我有以下多对多关系:
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_task
table 中?结果应该是:
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 .. SELECT
并交叉连接到 task
table 中的默认行,然后仅过滤未出现的用户 user_task
:
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)
上述查询使用 CROSS JOIN
以便 return user
和 task
的所有可能组合。 WHERE
子句过滤掉与默认任务无关的任何行。最后,NOT EXISTS
过滤掉所有已分配任务的用户。
尝试以下查询
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
)
我有以下多对多关系:
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_task
table 中?结果应该是:
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 .. SELECT
并交叉连接到 task
table 中的默认行,然后仅过滤未出现的用户 user_task
:
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)
上述查询使用 CROSS JOIN
以便 return user
和 task
的所有可能组合。 WHERE
子句过滤掉与默认任务无关的任何行。最后,NOT EXISTS
过滤掉所有已分配任务的用户。
尝试以下查询
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
)