Напишите SQL-запрос, чтобы перечислить идентификатор записи и дату записи всех записей, которые появляются на всех компакт-дисках в таблице компакт-дисков. - PullRequest
0 голосов
/ 16 февраля 2019

Я, вероятно, пытался написать этот запрос 30 различными способами, и я просто не могу понять это.Вот проблема:

"Напишите запрос SQL, чтобы перечислить идентификатор записи и дату записи всех записей, которые появляются на всех компакт-дисках в таблице компакт-дисков. Запишите запрос, используя EXISTS.Columns должно быть rcdid иrcddate. "

Я не могу понять, как правильно это понять.Каждый запрос, который я делаю, просто перечисляет rcdid и rcddate всей таблицы записей, независимо от того, что.

Вот таблицы, которые могут (или могут) быть полезными:

CREATE TABLE label (
  lbltitle varchar(50) not null,
  lblstreet varchar(50) not null,
  lblcity varchar(50) not null,
  lblstate char(2) not null,
  lblpostcode varchar(10) not null,
  lblnation char(3) not null,
    PRIMARY KEY(lbltitle));

CREATE TABLE cd (
  cdid integer not null,
  cdlblid varchar(50) not null,
  cdtitle varchar(100) not null,
  cdyear integer not null,
  lbltitle varchar(50) not null,
    PRIMARY KEY(cdid),
    CONSTRAINT FOREIGN KEY(lbltitle) REFERENCES label(lbltitle));

CREATE TABLE composition (
  compid integer not null,
  comptitle varchar(100) not null,
  compyear integer,
    PRIMARY KEY(compid));

CREATE TABLE recording (
  rcdid integer not null,
  rcdlength decimal(4,2) not null,
  rcddate date,
  compid integer not null,
    PRIMARY KEY(rcdid, compid),
    CONSTRAINT FOREIGN KEY(compid) REFERENCES composition(compid));

CREATE TABLE track (
  cdid integer not null,
  trknum integer not null,
  rcdid integer not null,
  compid integer not null,
    PRIMARY KEY(cdid, trknum),
    CONSTRAINT FOREIGN KEY(cdid) REFERENCES cd(cdid),
               FOREIGN KEY(rcdid, compid) REFERENCES recording(rcdid, compid));

Вот диаграмматаблицы, если это поможет: https://i.imgur.com/Qzr5EMl.png

И вот пара моих многочисленных попыток:

SELECT rcdid, rcddate FROM recording
 WHERE EXISTS (
    SELECT * FROM cd JOIN track ON cd.cdid = track.cdid);

SELECT recording.rcdid, rcddate FROM recording JOIN track
  ON track.rcdid = recording.rcdid
  WHERE EXISTS (
    SELECT * FROM cd JOIN track on cd.cdid = track.cdid WHERE track.rcdid = recording.rcdid);

Как я уже сказал, каждый мой запрос извлекает информацию из каждой строки взапись таблицы, и я в полной растерянности.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Если целью является поиск записей, которые появляются во ВСЕХ компакт-дисках.

Тогда количество CD для этого идентификатора записи должно быть таким же, как количество всех компакт-дисков.

Так что, возможно, что-то вроде этого:

select rcdid, rcddate
from recording rcd
cross join (select count(cdid) as total from cd) cd
where exists 
(
  select 1
  from track tr
  where tr.rcdid = rcd.rcdid
  group by tr.rcdid
  having count(distinct tr.cdid) = cd.total
);

Тест на rextester здесь

0 голосов
/ 16 февраля 2019

Вам необходим коррелированный подзапрос между recording и track:

select rcdid, rcddate
from recording as r
where exists
 ( select *
   from track as t
   where t.rcdid  = r.rcdid
     and t.compid = r.compid
 )

Нет необходимости добавлять cd, поскольку существует внешний ключ между track и cd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...