首页 > 解决方案 > sql - 查找所有不需要红色部分的作业

问题描述

我有一个包含最终产品的表格“工作”和一个包含最终产品组成的各个部分的表格“零件”。第三个表“supp_part_job”将作业和部件链接在一起(因为它们处于:n 关系)。我想找到所有不包含红色部分的最终产品(='job')。

相关表格:

如果不存在 `part` 则创建表 (
  `PARTNO` varchar(2) NOT NULL DEFAULT '',
  `PARTNAME` varchar(10) 默认为 NULL,
  `COLOR` varchar(10) 默认为空,
  `WEIGHT` int(5) 默认为空,
  `CITY` varchar(20) 默认为空,
  主键(`PARTNO`)
)

如果不存在`job`,则创建表(
  `JOBNO` varchar(2) NOT NULL DEFAULT '',
  `JOBNAME` varchar(20) 默认为空,
  `CITY` varchar(20) 默认为空,
  主键(`JOBNO`)
)

如果不存在“supp_part_job”,则创建表(
  `SUPPNO` varchar(2) NOT NULL DEFAULT '',
  `PARTNO` varchar(2) NOT NULL DEFAULT '',
  `JOBNO` varchar(2) NOT NULL DEFAULT '',
  `QUANTITY` int(5) 默认为空,
  主键(`SUPPNO`,`PARTNO`,`JOBNO`),
  KEY `SUPP_PART_JOB_JOB_FK1`(`JOBNO`),
  KEY `SUPP_PART_JOB_PART_FK1`(`PARTNO`)
)

这是如何完成的,这可以作为子查询和连接来完成吗?

我努力了:

选择不同的jobno
 来自 supp_part_job
 partno 在哪里
(从颜色!='红色'的部分中选择partno);

这不起作用,因为它 - 如果我理解正确的话 - 返回包含任何非红色部分的所有作业。

标签: mysqljoinsubquery

解决方案


下面的子查询会找到您不想要的所有工作。外部查询找到您想要的。

select distinct jobno
from job 
where jobno not in (
  select jobno
  from supp_part_job pj
  join part p on p.partno = pj.partno
  where color = 'red'
)

推荐阅读