Databases
T02-004- Inserción de registros a partir de consultas.
Enunciado
Es posible insertar en una tabla valores que se obtienen directamente del resultado de una consulta.
Ejemplo
Imaginemos que se va a realizar una restructuración de la empresa, de manera que los empleados del departamento 'Public Relations' se van a integrar en el departamento 'Sales'.
La información de los empleados que han estado vinculados al departamento "Public Relations" debe incorporarse a la tabla job_history antes de reasignarles el departamento 'Sales'.
Comenzaremos realizando una consulta que busque la información de los empleados del departamento 'Public Relations':
SELECT EMPLOYEES.*
FROM EMPLOYEES JOIN DEPARTMENTS ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE DEPARTMENT_NAME = 'Public Relations';
EMPLOYEE_ID FIRST_NAME LAST_NAME PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID 204 Hermann Baer HBAER 515.123.8888 07-JUN-02 PR_REP 10000 - 101 70 A continuación, debemos conocer qué datos necesitamos incorporar a la tabla job_history, para adaptar la consulta anterior a los requisitos de la tabla job_history:
DESCRIBE job_history;
Column Null? Type EMPLOYEE_ID NOT NULL NUMBER(6,0) START_DATE NOT NULL DATE END_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) DEPARTMENT_ID - NUMBER(4,0) De toda la información de los empleados del departamento 'Public Relations' nos quedamos con la siguiente información:
SELECT EMPLOYEE_ID, HIRE_DATE, CURRENT_DATE, JOB_ID, EMPLOYEES.DEPARTMENT_ID
FROM EMPLOYEES JOIN DEPARTMENTS ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE DEPARTMENT_NAME = 'Public Relations';
EMPLOYEE_ID HIRE_DATE CURRENT_DATE JOB_ID DEPARTMENT_ID 204 07-JUN-02 05-NOV-21 PR_REP 70 Una vez que los datos resultantes de la sentencia cumplen con los requisitos de la tabla job_history, podemos utilizar esa consulta como origen de los datos que se van a utilizar en la inserción que debemos realizar en la tabla job_history.
INSERT INTO job_history
SELECT EMPLOYEE_ID, HIRE_DATE, CURRENT_DATE, JOB_ID, EMPLOYEES.DEPARTMENT_ID
FROM EMPLOYEES JOIN DEPARTMENTS ON (EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID)
WHERE DEPARTMENT_NAME = 'Public Relations';
1 row(s) inserted.Ejercicio
Vamos a crear departamentos diferentes para los gestores. Para ello, insertaremos, en la tabla departments, un registro por cada uno de los tipos de trabajo cuyo identificador finalice por '_MAN', con los siguientes datos:
- DEPARTMENT_ID: el que resulta de incrementar en 300 el departament_id del empleado que se va a nombrar como manager del departamento.
- DEPARTMENT_NAME: el JOB_TITLE del tipo de trabajo que se está insertando.
- MANAGER_ID: el menor identificador de empleado de entre los que tienen el tipo de trabajo que se está insertando.
- LOCATION_ID: el valor constante 1700
Tipo
Solución
INSERT INTO HR.departments
SELECT 300 + DEPARTMENT_ID, JOB_TITLE, MIN(EMPLOYEE_ID), 1700
FROM HR.jobs JOIN HR.employees USING (JOB_ID)
WHERE JOB_ID LIKE '%_MAN'
GROUP BY DEPARTMENT_ID, JOB_TITLE;
Prueba
SELECT * FROM HR.DEPARTMENTS
WHERE DEPARTMENT_ID > 250
LibrerÃas (Onfly databases)


