我无法获得我想要的结果,感到有些惊讶,所以我请你的专家帮助!
我有三个只显示重要部分的表:
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”的行,尽管它应该返回
答案 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);