mysql查找不在其他表中的行

jgovgodb  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(395)

我有点震惊,我不能产生我想要的结果,所以我请各位Maven帮忙!
我有三张表只显示了重要的部分:
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")

这将为personname1提供未分配的时间表。作品。
如果删除括号内的where语句,它将不返回任何行(因为它与整个数据集匹配)
非常感谢您的帮助
提前谢谢
编辑:尝试使用左联接,但它不会返回带有“null”的行,尽管它应该返回

pgccezyw

pgccezyw1#

使用交叉连接有一个选项:

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

相关问题