sql - найти все рабочие места, которые не нуждаются в красных частях - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть таблица 'job', которая содержит конечные продукты, и таблица 'part', которая содержит отдельные части, из которых сделаны конечные продукты.Третья таблица «supp_part_job» связывает задания и части вместе (поскольку они находятся в отношении: n).Я хочу найти все конечные продукты (= 'работа'), которые не содержат красных частей.

Соответствующие таблицы:

CREATE TABLE IF NOT EXISTS `part` (
  `PARTNO` varchar(2) NOT NULL DEFAULT '',
  `PARTNAME` varchar(10) DEFAULT NULL,
  `COLOR` varchar(10) DEFAULT NULL,
  `WEIGHT` int(5) DEFAULT NULL,
  `CITY` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`PARTNO`)
) 

CREATE TABLE IF NOT EXISTS `job` (
  `JOBNO` varchar(2) NOT NULL DEFAULT '',
  `JOBNAME` varchar(20) DEFAULT NULL,
  `CITY` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`JOBNO`)
) 

CREATE TABLE IF NOT EXISTS `supp_part_job` (
  `SUPPNO` varchar(2) NOT NULL DEFAULT '',
  `PARTNO` varchar(2) NOT NULL DEFAULT '',
  `JOBNO` varchar(2) NOT NULL DEFAULT '',
  `QUANTITY` int(5) DEFAULT NULL,
  PRIMARY KEY (`SUPPNO`,`PARTNO`,`JOBNO`),
  KEY `SUPP_PART_JOB_JOB_FK1` (`JOBNO`),
  KEY `SUPP_PART_JOB_PART_FK1` (`PARTNO`)
)

Как это делается и может ли это быть выполнено как подзапрос, а также как соединение?

Я пытался:

select distinct jobno 
 from supp_part_job 
 where partno in 
(select partno from part where color != 'red');

, который не работает, так как это - если я понимаюправильно - возвращает все задания, которые содержат любую часть, которая не является красной.

1 Ответ

0 голосов
/ 16 декабря 2018

Подзапрос ниже находит все работы, которые вам не нужны.Внешний запрос находит тот, который вы хотите.

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'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...