Databases

T02-004- Inserción de registros a partir de consultas.

Enunciado

También podemos hacer uso de subconsultas para conseguir el valor que se introducirá en alguno o varios de los atributos.

Ejemplo

Queremos insertar un nuevo departamento con las siguientes características:

  • DEPARTMENT_ID: 300
  • DEPARTMENT_NAME: 'DAW'
  • MANAGER_ID: El que consta como manager del departamento cuyo nombre es 'IT'
  • LOCATION_ID: La única dirección que consta en la ciudad de 'Oxford'

Lo resolveríamos con la siguiente sentencia:

INSERT INTO departments
VALUES (
    300, -- DEPARTMENT_ID
    'DAW', -- DEPARTMENT_NAME
    (SELECT MANAGER_ID FROM departments WHERE DEPARTMENT_NAME = 'IT'), -- MANAGER_ID
    (SELECT LOCATION_ID FROM locations WHERE CITY = 'Oxford') -- LOCATION_ID
);

Hay que tener presente que estas subconsultas requieren devolver valores únicos, ya que a cada atributo de una fila únicamente le podemos asignar un valor.

Por ejemplo, si en lugar de la ciudad de 'Oxford', hubiéramos elegido el país cuyo código es 'UK' la sentencia nos habría devuelto el siguiente error:

INSERT INTO departments
VALUES (
    300, -- DEPARTMENT_ID
    'DAW', -- DEPARTMENT_NAME
    (SELECT MANAGER_ID FROM departments WHERE DEPARTMENT_NAME = 'IT'), -- MANAGER_ID
    (SELECT LOCATION_ID FROM locations WHERE COUNTRY_ID = 'UK') -- LOCATION_ID
);

ORA-01427: single-row subquery returns more than one row ORA-06512

Ejercicio

Imagina que te acaban de contratar en la empresa. Además de tu nombre, apellidos, email (sin teléfono), los datos de tu contratación son los siguientes:

  • EMPLOYEE_ID: 220
  • HIRE_DATE: CURRENT_DATE
  • JOB_ID: IT_PROG
  • SALARY: Empiezas con el salario mínimo de los que se permiten para el trabajo 'IT_PROG'
  • DEPARTMENT_ID: El identificador del departamento que tiene por nombre 'IT'
  • COMMISSION_PCT: Para compensar e incentivar, te asignan la máxima comisión de entre las asignadas a cualquier emploeado.
  • MANAGER_ID: El manager del departamento que te asignan.

Tipo

DDL

Solución


												
INSERT INTO HR.EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) VALUES (220, 'Alberto', 'Sierra', 'albsierra@carlosiii.es', CURRENT_DATE, 'IT_PROG', (SELECT MIN_SALARY FROM HR.JOBS WHERE JOB_ID = 'IT_PROG'), (SELECT MAX(COMMISSION_PCT) FROM HR.EMPLOYEES), (SELECT MANAGER_ID FROM HR.DEPARTMENTS WHERE DEPARTMENT_NAME = 'IT'), (SELECT DEPARTMENT_ID FROM HR.DEPARTMENTS WHERE DEPARTMENT_NAME = 'IT') );

Prueba


											
SELECT DEPARTMENT_ID, DEPARTMENT_NAME, EMPLOYEE_ID, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, EMPLOYEES.MANAGER_ID FROM HR.DEPARTMENTS JOIN HR.EMPLOYEES USING (DEPARTMENT_ID) WHERE EMPLOYEES.MANAGER_ID = 103

Librerías (Onfly databases)