mysql - MySQL查找不在其他表中的行
问题描述
我有点震惊,我无法产生我想要得到的结果,所以我向各位专家寻求帮助!
我有三个表只显示重要部分:
T1:(分配的所有名称和时间表的列表)
名称 | 时间表名称
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”的行,尽管它应该
解决方案
这是一个选项,使用交叉连接:
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;
交叉连接背后的想法是它生成所有可能的名称和时间表配对。也就是说,它代表了所有配对的整个集合。然后,我们将 join 留在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);
推荐阅读
- terraform - 使用 terraform 安全组模块在 cidr_block 中指定 private_ip 地址
- ios - 如何在隐藏后阻止我的 UITabBar 响应触摸?
- stripe-payments - 什么信用卡刷卡器适用于条纹?
- java - 无法使用 apache batik 将 SVG 文件转换为 PDF 文件
- python - python 的 dict.items() 是否总是返回相同的顺序?
- xcode - 从 Xcode 分析
- java - Java中的反序列化在多种方法中无法一致地工作
- angular - HttpClient 未返回所有响应标头
- css - 如何在 Bootstrap 4 中居中导航栏链接
- tfs - 使用没有 AD 的电脑连接到 Team Foundation Server