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 EMAIL 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

DML

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)