Соедините три таблицы вместе, чтобы получить одно значение - PullRequest
0 голосов
/ 22 сентября 2019

Я новичок в Postgresql и у меня есть три таблицы:

=# SELECT * FROM employee_names;
 employee_id | employee_name
-------------+---------------
           1 | Johannes
           2 | Günter
           3 | Elsabeth

=# SELECT * FROM projects;
 employee_id | last_project
-------------+--------------
           1 | 5
           2 | 15
           3 | 8

=# SELECT * FROM last_project_systems_used;
 employee_id | last_project | systems_used
-------------+--------------+--------------
           1 |            5 |           11
           1 |            5 |           18
           2 |           15 |            4
           3 |            8 |           10
           3 |            8 |            7
           3 |            8 |            2
  • employee_id в employee_names - это первичный ключ и серийный номер.
  • employee_name - этоуникальный.Да, я знаю, что в типичных случаях использования имя НЕ должно обрабатываться уникально, так как люди могут легко иметь одинаковые имена, но в моем примере это уникально.
  • employee_id в projects - это ключ pri.
  • last_project не является нулевым целым числом, и число может повторяться в обеих таблицах (номер проекта последнего проекта, над которым они работали)
  • systems_used уникально (номер системы, с которой они работали, будетвсегда быть уникальными значениями)

Подводя итог:

  • Иоганнес имеет значение employee_id 1, его последний проект был # 5, и он использовал обе системы 11 и 18 в своемproject.
  • Günter имеет employee_id 2, его последний проект был # 15, и он использовал обе системы 4. В своем проекте.
  • Elsabeth имеет employee_id 3, ее последний проект был #8, и она использовала системы 10, 7 и 2. в своем проекте.

Мне нужно выполнить запрос вставки примерно так:

    INSERT INTO last_project_systems_used 
    VALUES ((SELECT employee_id FROM employee_names 
    WHERE employee_name = 'Günter'), 
    (SELECT last_project FROM projects 
    WHERE (SELECT employee_id FROM employee_name 
    WHERE employee_name = 'Günter')), 9);

Это будет проверять, чтоemployee_id предназначен для Гюнтера (2), найдите его последний проектt number is (15) и добавьте системный номер 9 в таблицу.

Это обновление будет выглядеть следующим образом:

 employee_id | last_project | systems_used
-------------+--------------+--------------
           1 |            5 |           11
           1 |            5 |           18
           2 |           15 |            4
           3 |            8 |           10
           3 |            8 |            7
           3 |            8 |            2
           2 |           15 |            9

Хотя у меня возникли проблемы с частью, где я получил последний проектномер от сотрудника с именем Гюнтер, так как в таблице проектов указан только его идентификатор, а не его имя.

Любая помощь будет признательна.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Использование INSERT . . . SELECT:

INSERT INTO last_project_systems_used (employee_id, last_project, systems_used)
    SELECT en.employee_id, p.last_project, 9
    FROM projects p JOIN
         employee_names en
         ON p.employee_id = en.employee_id
    WHERE en.employee_name = 'Günter';
0 голосов
/ 22 сентября 2019

С достаточным количеством проб и ошибок я обнаружил, что это, кажется, делает свое дело, если есть лучшие решения для этого или если мой SQL звучит плохо, пожалуйста, дайте мне знать.

INSERT INTO last_project_systems_used VALUES
((SELECT employee_id FROM employee_names
WHERE employee_name = 'Günter'),
(SELECT last_project FROM projects
WHERE employee_id = (SELECT employee_id FROM employee_names
WHERE employee_name = 'Günter')), 9);
...