Qualcuno mi spiega perché i due codici non sono equivalenti?

di il
2 risposte

Qualcuno mi spiega perché i due codici non sono equivalenti?

Schema:

departments (department_id, department_name, manager_id, location_id) , employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, department_id)

testo dell'esercizio :

mostrare {first_name, last_name, salary} di tutti gli impiegati che percepiscono uno stipendio maggiore della media dei salari e lavorano in un dipartimento il cui nome contiene la parola “IT”;

il mio svolgimento:

select first_name, last_name, salary
from employees
where salary>(select avg (salary)
            from employees
            where department_id=any (select department_id
                                from departments
                                where department_name like '%IT%'))

la soluzione del prof:

SELECT first_name, last_name, salary
FROM employees AS e1
WHERE salary > (
SELECT AVG(salary)
FROM employees
) AND department_id IN (
SELECT department_id
FROM departments
WHERE department_name LIKE '%IT%')

2 Risposte

  • Re: Qualcuno mi spiega perché i due codici non sono equivalenti?

    Prima di scrivere in un forum leggine il regolamento.

    Cambia il titolo che non significa nulla e formatta comunque il codice (anche SQL) che proponi.

    Il testo dice “della media dei salari” quindi della media dei salari di TUTTI i lavoratori, come nella soluzione del professore.

  • Re: Qualcuno mi spiega perché i due codici non sono equivalenti?

    22/01/2024 - peppe999 ha scritto:


    Schema:

    departments (department_id, department_name, manager_id, location_id) , employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, department_id)

    testo dell'esercizio :

    mostrare {first_name, last_name, salary} di tutti gli impiegati che percepiscono uno stipendio maggiore della media dei salari e lavorano in un dipartimento il cui nome contiene la parola “IT”;

    il mio svolgimento:

    select first_name, last_name, salary
    from employees
    where salary>(select avg (salary)
                from employees
                where department_id=any (select department_id
                                    from departments
                                    where department_name like '%IT%'))

    la soluzione del prof:

    SELECT first_name, last_name, salary
    FROM employees AS e1
    WHERE salary > (
    SELECT AVG(salary)
    FROM employees
    ) AND department_id IN (
    SELECT department_id
    FROM departments
    WHERE department_name LIKE '%IT%')

    Nel tuo codice la media degli stipendi viene calcolata solo per gli impiegati nei departimenti “IT”, nel codice del professore viene calcolata indipendentemente dal loro dipartimento.

    Il tuo codice sembrerebbe più in linea con il testo dell'esercizio, sempre se il professore non intendesse di prendere tutti gli impiegati che percepiscono uno stipendio maggiore della media dei salari indipendentemente dal loro dipartimento e poi anche impiegati che lavorano in un dipartimento “IT”.

    Nel codice del professore l'alias AS e1 potrebbe essere tranquillamente rimosso, non trovo l'utilità, a parer mio il tuo è quello corretto.

Devi accedere o registrarti per scrivere nel forum
2 risposte