SQL使用复合主键

时间:2018-03-11 22:09:13

标签: mysql sql tsql jointable

我遇到了一个问题,我正在尝试填充一个由用户和任务组成的表。该表当前具有已完成任务的一些用户,并且存在用户无法两次完成相同任务的约束。这是一个例子:

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

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

我的所有尝试都失败了,所以我回到原点,没有真正的工作代码。但是,我的想法是将所有用户的列表与已经完成有问题的任务的用户列表进行比较,然后对两个列表进行区分,以获得尚未完成任务的用户列表。我不知道如何才能写出来。任何建议或例子将不胜感激。

2 个答案:

答案 0 :(得分:0)

因此,您可以利用反连接来显示尚未完成任务1和2的所有用户。然后,您可以使用此列表插入任务表。

请参阅:

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 

然后重复此操作,但更改"任务1"到"任务2"

答案 1 :(得分:0)

这最终成为其中一个问题,在您逐步输入并发布后,您开始计算答案。

正如我在我的问题中所说的那样......我需要将所有用户的列表与已经完成有问题的任务的用户列表进行比较,然后将这两个列表区分开以获得具有的用户列表没完成任务。

这就是我解决它的方法:

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

EXCEPT

SELECT Users
FROM TasksTable
WHERE TaskCompleted = Task1
) as UsersWithoutCompletedTask

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