MySQL查找不在其他表中的行

MySQL查找不在其他表中的行,mysql,Mysql,我有点震惊,我无法产生我想要的结果,所以我向你们专家寻求帮助 我有三张表,只显示了重要部分: T1:(所有指定名称和时间表的列表) 名称|计划名称 T2:(所有可能的计划名称) 计划名称 T3:(所有姓名列表) 名字 我尝试查找未分配的每个人的ScheduleName。最后,我希望看到: Name1 | ScheduleName1 Name1 | ScheduleName2 Name1 | ScheduleName3 Name2 | ScheduleName2 我尝试的是: SELECT

我有点震惊,我无法产生我想要的结果,所以我向你们专家寻求帮助

我有三张表,只显示了重要部分:

T1:(所有指定名称和时间表的列表)
名称|计划名称

T2:(所有可能的计划名称)
计划名称

T3:(所有姓名列表)
名字

我尝试查找未分配的每个人的ScheduleName。最后,我希望看到:

Name1 | ScheduleName1 
Name1 | ScheduleName2
Name1 | ScheduleName3
Name2 | ScheduleName2
我尝试的是:

SELECT
    T2.ScheduleName
FROM
    T2
WHERE
    T2.ScheduleName NOT IN
(SELECT T1.ScheduleName FROM T1 WHERE T1.Name = "Name1")
这将为人员名称1提供未分配的计划。有效。
如果删除括号内的WHERE语句,它将不返回任何行。(因为它与整个数据集相匹配)

非常感谢你的帮助

提前谢谢


编辑:尝试使用左联接,但它不会返回带有“NULL”的行,尽管它应该返回,这里有一个选项,使用交叉联接:

SELECT
    T3.Name,
    T2.ScheduleName
FROM T2
CROSS JOIN T3
LEFT JOIN T1
    ON T2.ScheduleName = T1.ScheduleName AND T3.Name = T1.Name
WHERE
    T1.Name IS NULL;
交叉连接背后的思想是,它生成所有可能的名称和时间表配对。也就是说,它表示所有对的整个集合。然后,我们将其加入
T1
赋值表,以查找从未进行过的配对

我们也可以使用
EXISTS
逻辑实现同样的功能:

SELECT
    T3.Name,
    T2.ScheduleName
FROM T2
CROSS JOIN T3
WHERE NOT EXISTS (SELECT 1 FROM T1
                  WHERE T2.ScheduleName = T1.ScheduleName AND T3.Name = T1.Name);

这对我有用!英雄非常感谢你。我现在也明白为什么它不起作用了!一到期限就可以