присоединиться к группе по условию во вложенном запросе выбора - PullRequest
0 голосов
/ 20 февраля 2020

Привет, я новичок в sql, и я пытаюсь решить этот запрос: найти регистрационные номера (MATRICOLA) и фамилии (COGNOME) сотрудников, у которых зарплата больше, чем минимум на 10%, чем у средняя зарплата их отдела.

IMPIEGATO(employees)
DIPARTIMENTO(department)

Here are the TABLES

SELECT *
from (
  SELECT *
  FROM IMPIEGATO imp1, 
       DIPARTIMENTO dip1
  where imp1.dipartimento_codice_fk = dip1.codice
), (
  SELECT dip.codice, 1.1*avg(imp.stipendio) AS "STIPENDIO_MEDIO_10"
  FROM IMPIEGATO imp
    JOIN DIPARTIMENTO dip ON dip.CODICE=imp.DIPARTIMENTO_CODICE_FK
  GROUP BY dip.codice
)

Я не могу добавить это, где условие, чтобы получить только те результаты, которые мне нужны WHERE dip.codice=dip1.codice. Это ошибка, которую я получаю

ORA-00904: «DIP1». «CODICE»: identificativo недействительно
00904. 00000 - «% s: неверный идентификатор»
* Причина:
* Действие:
Errore alla riga: 255, колонна: 18

1 Ответ

0 голосов
/ 20 февраля 2020

Вы ссылаетесь на CODICE вне этих двух подзапросов с псевдонимом (dip или dip1), присвоенным DIPARTIMENTO в подзапросе. (Область псевдонимов находится только внутри подзапроса)

В любом случае, лучшим решением будет использование analytical function следующим образом:

SELECT MATRICOLA, COGNOME
FROM
    ( SELECT
            EMP.MATRICOLA, EMP.COGNOME, EMP.STIPENDIO,
            AVG(EMP.STIPENDIO) OVER(
                PARTITION BY EMP.DIPARTIMENTO_CODICE_FK
            ) AS AVG_SALARY_DEPT
        FROM IMPIEGATO EMP
             JOIN DIPARTIMENTO DEPT ON EMP.DIPARTIMENTO_CODICE_FK = DEPT.CODICE
    )
WHERE STIPENDIO >= 1.1 * AVG_SALARY_DEPT;

Вы также можете использовать свой собственный запрос с небольшим немного изменений в нем. Изменения упоминаются в комментариях к следующему запросу:

SELECT t1.MATRICOLA, t1.COGNOME 
from (
  SELECT *
  FROM IMPIEGATO imp1, 
       DIPARTIMENTO dip1
  where imp1.dipartimento_codice_fk = dip1.codice
) t1 join -- given alias
(
  SELECT dip.codice, 1.1*avg(imp.stipendio) AS "STIPENDIO_MEDIO_10"
  FROM IMPIEGATO imp
    JOIN DIPARTIMENTO dip ON dip.CODICE=imp.DIPARTIMENTO_CODICE_FK
  GROUP BY dip.codice
) t2 on t1.codice = t2.codice -- given alias 
                              -- and added the join condition with proper alias(t1, t2)
where t1.stipendio >= t2.STIPENDIO_MEDIO_10 -- added the condition to fetch desired result

Cheers !!

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