SQL - 其中一个表不是另一个表(多个字段)

时间:2017-06-02 09:57:56

标签: mysql sql

我有以下表格

Tables

他们的关系如下:modulos保存所有模块,mods_alunos只保存每个学生制作的模块(nInterno标识学生)

    select modulos.codDisc, modulos.numero from modulos
    left join mods_alunos
    on modulos.codDisc=mods_alunos.codDisc
    and modulos.numero=mods_alunos.numero
    where 
    (mods_alunos.codDisc is null 
    and mods_alunos.numero is null
    )

此查询会丢失模块,但不会将学生纳入考虑范围

我正在寻找列出某个学生缺少的模块的查询

编辑1 - 样本数据

Modulos

codDisc | numero
------- | ------
1       | 1
1       | 2
1       | 3
2       | 1
2       | 2

mods_alunos

nInterno | codDisc  | numero
-------- | -------- | ------
11       | 1        | 1
11       | 1        | 2
11       | 1        | 3
11       | 2        | 1
12       | 2        | 2

通过这个例子我想要的是一个查询给我(codDisc 2,numero 2)当我问什么模块是学生11失踪

3 个答案:

答案 0 :(得分:1)

您需要在Student表中工作,而不是链接表。试试这个:

select s.Id, m.codDisc, m.numero 
from student s
cross join modulos m
where not exists(select *
                 from mods_alunos ma 
                 where ma.codDisc = m.codDisc 
                 and ma.numero = m.numero
                 and ma.nInterno = s.Id)

student是您的学生表,而s.Id是您的学生证

答案 1 :(得分:0)

更新:`MySQL不支持EXCEPT。

<击> 只需使用EXCEPT

select coddisc, numero from modulos
except
select coddisc, numero from mods_alunos where ninterno = 123;

NOT IN会有一个替代方案,虽然稍微复杂一些,所以我按照上面提到的EXCEPT进行操作。

select coddisc, numero from modulos
where (coddisc, numero) not in
  (select coddisc, numero from mods_alunos where ninterno = 123);

答案 2 :(得分:0)

您可以这样做:

SELECT * FROM modulus WHERE codeDisc NOT IN(SELECT codeDisc  FROM mods_alunos WHERE nInterno=?) AND numero NOT IN (SELECT numero FROM mods_alunos WHERE nInterno=?