SQL 使用复合主键填充自定义 table

SQL populating custom table with composite primary key

我 运行 遇到了一个问题,我正在尝试填充由用户和任务组成的 table。 table 目前有一些用户已完成任务,并且存在用户不能两次完成同一任务的限制。这是一个例子:

*UsersTable*                *TasksTable*
**Users**                   **Users**       **TaskCompleted**
User1                       User1           Task1
User1                       User1           Task2
User3                       User3           Task1
User4                       User4           Task3
User5
User6

我的目标是检查是否所有用户都完成了 Task1,如果没有,则插入“TasksTable”以显示他们已完成 Task1。然后我想为 Task2 做同样的事情。 Task3 应该没有变化。

我所有的尝试都失败了,所以我回到原点,没有真正的工作代码。但是,我的想法是将所有用户列表与已完成相关任务的用户列表进行比较,然后比较这两个列表以获得尚未完成任务的用户列表。我不确定如何写出来。如有任何建议或示例,我们将不胜感激。

所以你可以利用一个anti-join来显示所有没有完成任务1和2的用户。然后你可以使用这个列表插入任务table。

参见:

INSERT INTO tasks
SELECT 
user 
completed_task_1 AS completed_tasks
FROM 
(
SELECT 
user_1 
, completed_tasks_1
(
SELECT 
user AS user_1
, "Task 1" AS completed_tasks_1
FROM 
users
) t1
LEFT JOIN 
tasks b
ON user_1 = b.user AND completed_tasks_1 = b.completed_tasks
) anti_join 
WHERE user IS NULL 

然后重复此操作,但将 "Task 1" 更改为 "Task 2"

这最终成为您在逐步输入并 post 之后开始找出答案的问题之一。

正如我在问题中所述...我需要将所有用户列表与已完成相关任务的用户列表进行比较,然后比较这两个列表以获得用户列表谁还没有完成任务。

我是这样解决的:

INSERT INTO TasksTable
SELECT Users, 1
FROM
(
SELECT Users
FROM UsersTable

EXCEPT

SELECT Users
FROM TasksTable
WHERE TaskCompleted = Task1
) as UsersWithoutCompletedTask

然后我对 Task2 做了同样的事情。