Как выполнить функцию IS_THE_SUBSET_OF в MySQL?

0

Добавлено: код CREATE для ученика и принимает

CREATE TABLE 'student' (
    'sid' VARCHAR(6) NOT NULL,
    'sname' VARCHAR(6) NULL DEFAULT NULL,
    'sex' VARCHAR(2) NULL DEFAULT NULL,
    'age' TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    'dept' VARCHAR(50) NULL DEFAULT NULL,
    'class' VARCHAR(4) NULL DEFAULT NULL,
    PRIMARY KEY ('sid')
);

CREATE TABLE 'takes' (
    'sid' VARCHAR(6) NOT NULL,
    'cid' VARCHAR(3) NOT NULL,
    'score' TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY ('sid', 'cid')
)

Я собираюсь отобразить идентификаторы и имена всех студентов, которые прошли курсы, которые были сделаны учеником, чей идентификатор "31401". У меня есть следующий код:

SELECT sid, sname
FROM student S
WHERE NOT EXISTS((SELECT cid
                 FROM takes
                 WHERE sid = '31401')
                 EXCEPT
                 (SELECT cid
                 FROM takes T
                 WHERE S.sid = T.sid));

Однако в MySQL нет операции EXCEPT. Поэтому я задаюсь вопросом, могу ли я переписать вот так:

SELECT sid, sname
FROM student S
WHERE ((SELECT cid
        FROM takes
        WHERE sid = '31401')
        IS_THE_SUBSET_OF
       (SELECT cid
        FROM takes T
        WHERE S.sid = T.sid));

Как я могу реализовать функцию IS_THE_SUBSET_OF?

  • 0
    Вы можете использовать HAVING, IS, IS NOT, IS IN () и т. д., или вы можете просто использовать объединения, чтобы делать то, что вы хотите, вместо этого сохранять подзапросы и работать намного быстрее.
  • 0
    Возможный дубликат ошибки при использовании, кроме как в запросе
Теги:

1 ответ

1
Лучший ответ

Оператор на основе набора не выполняет то, что вы хотите. Вы можете использовать join, group by и некоторую другую логику:

select t.sid
from takes t join
     takes ts
     on t.cid = ts.cid and ts.sid = 31401  -- don't use single quotes for a numeric constant
group by t.sid
having count(*) = (select count(*) from takes ts2 where ts2.sid = 31401);

Эта формулировка предполагает, что у takes не существует повторяющихся пар sid/cid.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню