Как `вставить в` с помощью select, используя` group by` и имеющий уникальный ключ ограничения в Oracle? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь insert into таблица, 5 значений из других 2 таблиц, но когда я пытаюсь вставить их, Oracle отправляет мне сообщение, что я нарушаю ограничение уникального ключа, что я не понимаю, почему у меня естьэта проблема, если я использую предложение distinct в select.

Спасибо

Мой запрос:

  insert into grados_salariales (Department_id,
  Department_name,Sumatoria,Sal_minimo,Sal_maximo)
  Select distinct departments.department_id,
  departments.department_name,
  sum(employees.salary),min(employees.salary),
  max(employees.salary)
  from employees,departments
  group by salary,department_name,
  departments.department_id;

Это уже существующая и уникальная таблицаключевое утверждение

create table
grados_salariales(
  Department_id number,
  Department_name varchar(50),
  Sumatoria number,
  Sal_minimo number,
  Sal_maximo number);




  Alter table grados_salariales
  add constraint  Department_id_pk
  primary key ( Department_id);

Я бы ожидал, что вставим department_id без проблем.

1 Ответ

2 голосов
/ 03 июля 2019

Это ваш запрос:

select distinct d.department_id, d.department_name,
       sum(e.salary), min(e.salary),
       max(e.salary)
from employees e join
     departments d
     on e.department_id = d.department_id
group by e.salary, d.epartment_name, d.department_id;

Проблема в salary в group by.Если вам нужна одна строка для каждого отдела, вы можете сделать:

select d.department_id, d.department_name,
       sum(e.salary), min(e.salary),
       max(e.salary)
from employees e join
     departments d
     on e.department_id = d.department_id
group by d.department_name, d.department_id;

Примечания:

  • Никогда не используйте запятые в предложении FROM.
  • Всегда используйте правильный, явный, стандартный JOIN синтаксис.
  • Используйте псевдонимы таблиц, чтобы ваши запросы было легче писать и читать.
  • SELECT DISTINCT почти никогда не подходит для GROUP BY.
...