Команда SQL неправильно завершена - не знаю почему - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь проработать этот SQL-запрос и постоянно зацикливаюсь на

Команда SQL неправильно завершена

заявление.

Точная ошибка:

 AND NOT PROJECT.dnum = EMPLOYEE.dno)) > 10
                                     *
 ERROR at line 4:
 ORA-00933: SQL command not properly ended

Вот схема:

    CREATE TABLE EMPLOYEE (
        fname VARCHAR(20), 
        minit CHAR(1), 
        lname VARCHAR(20), 
        ssn INT NOT NULL, 
        bdate VARCHAR(20), 
        address VARCHAR(40), 
        sex CHAR(1) check (sex IN ('M', 'F')), 
        salary INT CHECK (salary > 20000), 
        superssn INT,
        dno INT,
        PRIMARY KEY (ssn)
    );

    CREATE TABLE DEPARTMENT (
        dname VARCHAR(20),
        dnumber INT NOT NULL,
        mgr_ssn INT,
        mgr_start_date VARCHAR(20),
        PRIMARY KEY (dnumber)
    );

    CREATE TABLE DEPTLOCATIONS (
        dnumber INT NOT NULL, 
        dlocation VARCHAR(20) NOT NULL check (dlocation IN ('BELLAIRE', 'SUGARLAND', 'HOUSTON', 'STAFFORD')),
        PRIMARY KEY (dnumber, dlocation)
    );

    CREATE TABLE PROJECT (
        pname VARCHAR(20) NOT NULL,
        pnumber INT NOT NULL,
        plocation VARCHAR(20) CHECK (plocation IN ('BELLAIRE', 'SUGARLAND', 'HOUSTON', 'STAFFORD')),
        dnum INT NOT NULL,
        PRIMARY KEY (pnumber)
    );

    CREATE TABLE WORKS_ON (
        essn INT NOT NULL,
        pno INT NOT NULL,
        hours FLOAT check (hours >= 5 AND hours <= 40),
        PRIMARY KEY (essn, pno)
    );

    CREATE TABLE DEPENDENT (
        essn INT NOT NULL,
        dependent_name VARCHAR(40) NOT NULL,
        sex CHAR(1) check (sex IN ('M', 'F')),
        bdate VARCHAR(20),
        relationship VARCHAR(20) CHECK (relationship IN ('SPOUSE', 'SON', 'DAUGHTER')),
        PRIMARY KEY (essn, dependent_name)
    );

Я пытаюсь найти сотрудников, чьи зарплаты выше, чем средняя заработная плата всех сотрудников в том же отделе, и у которых есть два или больше иждивенцев; затем, для каждого найденного сотрудника, мне нужно проверить, работает ли сотрудник больше, чем в общей сложности 10 часов в неделю на проектах, не контролируемых их домашним отделом и напечатать полное имя сотрудника, если так, наряду с зарплатой, количество иждивенцев, общее количество часов на проектах, контролируемых домашним отделом, и общее количество часы работы над проектами, контролируемыми другими (т. е. не домашними) отделами

Вот мой SQL-запрос:

    SELECT concat(
    concat
    (EMPLOYEE.fname, ' '|| EMPLOYEE.minit), 
    ' '||EMPLOYEE.lname) as NAME, 
    EMPLOYEE.ssn,
    (select count(*) from dependent where Employee.ssn=dependent.essn) AS Num_Dependents, 

    (SELECT SUM(hours) FROM EMPLOYEE 
    JOIN WORKS_ON ON (EMPLOYEE.ssn = WORKS_ON.essn) 
    JOIN PROJECT ON (PROJECT.pnumber=WORKS_ON.pno) 
    WHERE PROJECT.dnum = EMPLOYEE.dno) 
    AS HOME_HOURS,

    (SELECT SUM(hours) FROM EMPLOYEE 
    JOIN WORKS_ON ON (EMPLOYEE.ssn = WORKS_ON.essn) 
    JOIN PROJECT ON (PROJECT.pnumber=WORKS_ON.pno) 
    WHERE NOT PROJECT.dnum = EMPLOYEE.dno) AS NOT_HOME_HOURS,

    (SELECT EMPLOYEE.salary FROM EMPLOYEE WHERE
    EMPLOYEE.salary > (SELECT AVG(salary) FROM EMPLOYEE WHERE EMPLOYEE.dno = dno))

    AND 

    (SELECT SUM(hours) FROM EMPLOYEE 
    JOIN WORKS_ON ON (EMPLOYEE.ssn = WORKS_ON.essn) 
    JOIN PROJECT ON (PROJECT.pnumber=WORKS_ON.pno) 
    AND NOT PROJECT.dnum = EMPLOYEE.dno)) > 10  
    AND (SELECT COUNT(*) FROM DEPENDENT WHERE essn = ssn) >= 2;

Я знаю, что, вероятно, он отформатирован не так хорошо, как мог бы, но я занимался этим часами, и, кажется, ничто не избавляет от этого

Команда SQL неправильно завершена

ошибка, возникающая при выполнении запроса. Любая помощь или советы будут очень благодарны! Спасибо всем.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

В вашем коде здесь:

( ВЫБЕРИТЕ СОТРУДНИКА. Заработная плата У РАБОТНИКА ГДЕ EMPLOYEE.salary> (ВЫБЕРИТЕ AVG (зарплата) ИЗ СОТРУДНИКА, ГДЕ EMPLOYEE.dno = dno) )

AND 

(SELECT SUM(hours) FROM EMPLOYEE 
JOIN WORKS_ON ON (EMPLOYEE.ssn = WORKS_ON.essn) 
JOIN PROJECT ON (PROJECT.pnumber=WORKS_ON.pno) 
AND NOT PROJECT.dnum = EMPLOYEE.dno)) > 10  
AND (SELECT COUNT(*) FROM DEPENDENT WHERE essn = ssn) >= 2;

Открывающая и закрывающая скобки (выделены жирным шрифтом) завершают этот оператор Select без учета оператора SELECT, в котором вы суммируете часы. Следовательно, общая структура при использовании предложения WHERE затрагивается.

0 голосов
/ 02 ноября 2018

Ваш sql выглядит странно. Сводя его к простому представлению, его структура выглядит примерно так (надеюсь, я правильно понял расположение скобок):

SELECT
  (Query),
  (Query),
  (Query) AND (Query)
) dangling unrelated fragment

Oracle требуется FROM, и он не может справиться со списком выбора, содержащим AND, подобный этому.

Я знаю, что, вероятно, отформатирован не так хорошо, как мог бы

Абсолютно 100% проблема. Не правильно выложив свой SQL, вы полностью потерялись в спагетти и в итоге получили SQL, который не имеет полного набора соответствующих скобок и поэтому страдает от синтаксических ошибок

Вот как выглядит ваш sql, если я помещу его в текстовый редактор и уравняю скобки, чтобы каждая строка, похожая на (query here) as alias,, занимала одну строку:

enter image description here

Вы видите, как в конце появляется дополнительная скобка и в конечном итоге разрушает вещи?

(Примечание для пуристов «не снимать скриншот» - было сделано намеренно, чтобы высветить проблему, как если бы оно было опубликовано в виде текста, оно, вероятно, обернулось бы и потеряло эффект)

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