SQL скрипт не возвращает правильную таблицу - PullRequest
0 голосов
/ 10 мая 2018

У меня есть следующие таблицы:

CREATE TABLE SKILL(
sname         VARCHAR(30)     NOT NULL,
    CONSTRAINT SKILL_pkey PRIMARY KEY ( sname ) );


CREATE TABLE APPLICANT(
anumber         DECIMAL(6)      NOT NULL,
fname           VARCHAR(20)     NOT NULL,
lname       VARCHAR(30) NOT NULL,
dob             DATE        NOT NULL,
city        VARCHAR(30) NOT NULL,
state       VARCHAR(20) NOT NULL,
phone       DECIMAL(10) NOT NULL,
fax     DECIMAL(10)     ,
email       VARCHAR(50)     ,
    CONSTRAINT APPLICANT_pkey PRIMARY KEY ( anumber ) );


CREATE TABLE SPOSSESSED(
anumber         DECIMAL(6)  NOT NULL,
sname       VARCHAR(30) NOT NULL,
slevel      DECIMAL(2)  NOT NULL,
    CONSTRAINT SPOSSESSED_pkey PRIMARY KEY ( anumber, sname ), 
    CONSTRAINT SPOSSESSED_fkey1 FOREIGN KEY ( anumber )
                REFERENCES APPLICANT ( anumber )
                ON DELETE CASCADE,
    CONSTRAINT SPOSSESSED_fkey2 FOREIGN KEY ( sname )
                REFERENCES SKILL ( sname ),
    CONSTRAINT SPOSSESSED_check1 CHECK ( slevel IN 
                    ( 1,2,3,4,5,6,7,8,9,10 ) ) );

Мне было приказано:

Создайте реляционную таблицу, которая содержит информацию об именах всех умений и наибольшем уровне умений, которыми обладает заявитель, а также количество заявителей, обладающих навыком на самом высоком уровне. Игнорируйте навыки, которыми не обладает ни один из претендентов. Все данные должны быть загружены в таблицу с помощью того же оператора SQL, который создает таблицу. Примените соответствующие ограничения первичного ключа и ссылочной целостности (если они есть) после загрузки данных.

Из того, что я понял, я придумал 2 отдельных сценария, чтобы сначала сделать выбор:

SELECT * FROM SKILL;

SELECT MAX(SPOSSESSED.slevel), APPLICANT.anumber
FROM APPLICANT RIGHT OUTER JOIN SPOSSESSED
ON APPLICANT.anumber = SPOSSESSED.anumber
GROUP BY anumber;

Я не знаю, правильно ли я сделал выбор или нет? Кто-нибудь может помочь? Чем больше я читаю требования, тем больше смущаюсь.

РЕДАКТИРОВАТЬ # 1:

Пример данных НАВЫКИ:

INSERT INTO SKILL VALUES ( 'C++ programming' );
INSERT INTO SKILL VALUES ( 'C programming' );
INSERT INTO SKILL VALUES ( 'Java programming' );
INSERT INTO SKILL VALUES ( 'SQL programming' );
INSERT INTO SKILL VALUES ( 'driving' );
INSERT INTO SKILL VALUES ( 'painting' );
INSERT INTO SKILL VALUES ( 'cooking' );

ЗАЯВИТЕЛЬ:

INSERT INTO APPLICANT VALUES ( 000001, 'Harry', 'Potter', '1980-12-12',  'Perth', 'Western Australia', 645278453, NULL, 'jones@gmail.com' );
INSERT INTO APPLICANT VALUES ( 000002, 'Johnny', 'Walker', '1990-02-13',  'Geelong', 'Victoria', 63569784, 63569785, 'blunder@hotmail.com' );
INSERT INTO APPLICANT VALUES ( 000003, 'Mary', 'Poppins', '1950-01-01',  'Melbourne', 'Victoria', 62389541, NULL, NULL );
INSERT INTO APPLICANT VALUES ( 000004, 'Michael', 'Collins', '1960-05-25',  'Brisbane', 'Queensland', 63336666, NULL, 'mike@hotmail.com');
INSERT INTO APPLICANT VALUES ( 000005, 'Margaret', 'Finch', '1953-12-07',  'Sydney','New South Wales', 64573489, NULL, 'mf@163.com');
INSERT INTO APPLICANT VALUES ( 000006, 'Claudia', 'Kowalewski', '1959-05-03',  'Hobart', 'Tasmania', 64577744, NULL, 'cch@cs.odmg.org');
INSERT INTO APPLICANT VALUES ( 000007, 'James', 'Bond', '1960-06-01','Perth', 'Western Australia', 645278434, NULL, 'james@bigpond.com');

SPOSSESSED:

INSERT INTO SPOSSESSED VALUES ( 000001, 'Java programming', 9 );
INSERT INTO SPOSSESSED VALUES ( 000001, 'C programming', 4 );
INSERT INTO SPOSSESSED VALUES ( 000001, 'cooking', 9 );
INSERT INTO SPOSSESSED VALUES ( 000002, 'Java programming', 9 );
INSERT INTO SPOSSESSED VALUES ( 000002, 'driving', 9 );
INSERT INTO SPOSSESSED VALUES ( 000003, 'C++ programming', 10 );
INSERT INTO SPOSSESSED VALUES ( 000003, 'Java programming', 9 );
INSERT INTO SPOSSESSED VALUES ( 000003, 'painting', 5 );
INSERT INTO SPOSSESSED VALUES ( 000005, 'SQL programming', 6 );
INSERT INTO SPOSSESSED VALUES ( 000006, 'SQL programming', 8 );
INSERT INTO SPOSSESSED VALUES ( 000007, 'SQL programming', 9 );
INSERT INTO SPOSSESSED VALUES ( 000007, 'cooking', 10 );

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

Но, насколько я понимаю, в нем должна быть таблица с именем sname, самым высоким уровнем для этого имени и номером с самым высоким уровнем этого имени.

Это настолько конкретно, насколько я могу понять ...

1 Ответ

0 голосов
/ 10 мая 2018

Следующий запрос создаст список всех навыков и кандидатов с самым высоким уровнем квалификации для каждого навыка.

SELECT
    c.`anumber`,
    a.`sname`
FROM `SPOSSESSED` a
JOIN (
    SELECT 
        `sname`
        MAX(`slevel`) as `slevel`
    FROM `SPOSSESSED`
    GROUP BY `sname`
    ) b
    ON b.`sname` = a.`sname` AND b.`slevel` = a.`slevel`
JOIN `APPLICANT` c
    ON c.`anumber` = a.`anumber`
GROUP BY a.`sname`, c.`anumber`

Если вместо списка кандидатов с наивысшим уровнем квалификации для каждого навыка требуется количество кандидатов с наивысшим уровнем квалификации для каждого навыка, Вы можете попробовать это:

SELECT
    a.`sname`,
    a.`slevel`,
    count(DISTINCT c.`anumber`) as `numapplicants`
FROM `SPOSSESSED` a
JOIN (
    SELECT 
        `sname`
        MAX(`slevel`) as `slevel`
    FROM `SPOSSESSED`
    GROUP BY `sname`
    ) b
    ON b.`sname` = a.`sname` AND b.`slevel` = a.`slevel`
JOIN `APPLICANT` c
    ON c.`anumber` = a.`anumber`
GROUP BY a.`sname`, a.`slevel`

Не проверено, и может иметь опечатку.

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