2016-10-04 50 views
2

(如果这个标题的问题是错误的,有人请修复它。)MYSQL如何选择从其他表值不存在

我有三个表这样

TABLE SCHOOL 

--------+--------+---- 
No. |NAME |CLASS | 
--------+--------+---- 
1. |Batman |math | 
--------+--------+---- 
2. |Batman |biology| 
--------+--------+---- 
4. |Batman |karate | 
--------+--------+---- 
5. |Superman|biology| 
--------+--------+---- 
6. |Superman|karate | 
--------+--------+---- 
7. |Superman|swim | 
--------+--------+---- 

TABLE SUPERHERO 
--------+----- 
No. |NAME | 
--------+----- 
1. |Batman | 
--------+----- 
2. |Superman| 
--------+----- 

TABLE CLASS 

--------+----- 
No. |CLASS | 
--------+----- 
1. |Math | 
--------+----- 
2. |biology | 
--------+----- 
3. |karate | 
--------+----- 
4. |Swim | 
--------+----- 

问题是:如何选择那个蝙蝠侠没有参加游泳课,而超人没有参加数学课? 这样的:

(Output table that I want) 
+--------+-------+ 
|NAME |CLASS | 
+--------+-------+ 
|Batman |swim | 
+--------+-------+ 
|Superman|math | 
+--------+-------+ 

回答

2

您需要CROSS JOINSUPERHEROCLASS榜第一,以获得SUPERHERO & CLASS所有可能的组合。

稍后在上面的交叉连接表tSCHOOL表之间做一个左连接。

最后通过检查相应SCHOOL进入NULL过滤WHERE子句中的结果可以确保这些组合(superheroclass)不SCHOOL表中实际存在的

SELECT 
t.NAME, 
t.CLASS 
FROM 
(
    SELECT 
    SH.NAME, 
    C.CLASS 
    FROM SUPERHERO SH 
    CROSS JOIN CLASS C 
) AS t 
LEFT JOIN SCHOOL S ON t.NAME = S.NAME AND t.CLASS = S.CLASS 
WHERE S.NO IS NULL 
+0

感谢了很多,它的工作:) –