SQL:从不包含来自另一个表的值的表中选择数据

问题描述 投票:0回答:2
CREATE TABLE `entidade_pessoa_avaliacao` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idEntidade_pessoa` int(10) unsigned NOT NULL,
  `idSemana` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idEscola_Matriculado_idSemana` (`idEntidade_pessoa`,`idSemana`),
  KEY `idEscola_Matriculado` (`idEntidade_pessoa`),
  KEY `idSemana` (`idSemana`),
  CONSTRAINT `FK_smsescola_escola_acao_smsescola_escola_matriculado` FOREIGN KEY (`idEntidade_pessoa`) REFERENCES `entidade_pessoa` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_smsescola_escola_matriculado_avaliacao_smsescola_semana` FOREIGN KEY (`idSemana`) REFERENCES `semana` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=115 DEFAULT CHARSET=utf8;

INSERT INTO `entidade_pessoa_avaliacao` (`id`, `idEntidade_pessoa`, `idSemana`) VALUES
    (1, 1, 1),
    (2, 2, 1),
    (3, 3, 1),
    (4, 1, 2),
    (5, 2, 2),
    (6, 3, 2);

CREATE TABLE  `semana` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome_curto` varchar(250) NOT NULL,
  `inicio` date NOT NULL COMMENT,
  `termino` date NOT NULL COMMENT,
  `idDimensao` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idDimensao` (`idDimensao`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;

INSERT INTO `semana` (`id`, `nome_curto`, `inicio`, `termino`) VALUES
    (1, 'Faltas', '2017-10-24', '2017-11-14'),
    (2, 'Tarefas','2017-11-07', '2017-11-14'),
    (3, 'Participacao','2017-11-07', '2017-11-14');

如何根据日期获取哪一周不在 student_avaliation 表中?

例如,哪一周没有登记在哪里

week.end='14/11/2017'
.

我必须使用 NOT EXISTS 但我不知道如何使用。

mysql sql select subquery
2个回答
0
投票

如果您想返回未注册的那一周:

SELECT * 
FROM dbo.[week] w
WHERE NOT EXISTS (
  SELECT * FROM dbo.student_avaliation sa
  WHERE w.id = sa.idWeek)

SQLFiddle准备数据: http://sqlfiddle.com/#!6/c92c45/5

要知道本周是否有任何注册(

student_avaliation
表中的条目),左加入并汇总:

SELECT w.id
, w.start
, w.[end]
, w.name
, CASE WHEN sa.id is null then 'Not Registered' else 'Registered' end as WeekRegistered
FROM dbo.[week] w
LEFT JOIN dbo.student_avaliation sa
    ON w.id = sa.idWeek
GROUP BY w.id
, w.start
, w.[end]
, w.name
, CASE WHEN sa.id is null then 'Not Registered' else 'Registered' end
ORDER BY w.id

0
投票
SELECT * FROM (SELECT A.ID,A.START,A.ENDDATE,B.ID Z FROM WEEK A
LEFT OUTER JOIN student_avaliation B
ON A.ID=B.IDWEEK) AA
WHERE AA.Z IS NULL
AND AA.ENDDATE='14/11/2017';

select a.* from week a where not exists  (select * from student_avaliation b
where a.id=b.idweek);
© www.soinside.com 2019 - 2024. All rights reserved.