MySQL查找不在其他表中的行

时间:2018-11-14 13:43:28

标签: mysql

我无法获得我想要的结果,感到有些惊讶,所以我请你的专家帮助!

我有三个只显示重要部分的表:

T1 :(分配的所有名称和时间表的列表)
    姓名| ScheduleName

T2 :(所有可能的日程表名称)
    ScheduleName

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")

这给我没有分配给Person Name1的时间表。作品。
如果删除括号内的WHERE语句,则不返回任何行。 (因为它与整个数据集匹配)

非常感谢

预先感谢

编辑:试图与LEFT JOIN一起使用,但是它不返回带有“ NULL”的行,尽管它应该返回

1 个答案:

答案 0 :(得分:1)

这是使用交叉联接的一种选择:

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);