Oracle SQL запрос с подзапросами или я должен нормализовать? - PullRequest
2 голосов
/ 30 июля 2010

У меня есть следующий запрос, который работает, но мне интересно, может ли он быть более эффективным.Мне нужно имя и фамилия 4 сотрудников из таблицы телефонной книги (pb), чьи значки (идентификатор сотрудника) хранятся в таблице обязательств

SELECT Originator_ID, 
(SELECT pb.lname FROM pb WHERE pb.badge = Commitment.Originator_ID) AS Originator_Last_Name, 
(SELECT pb.fname FROM pb WHERE pb.badge = Commitment.Originator_ID) AS Originator_First_Name, 
Checker_ID, 
(SELECT pb.lname FROM pb WHERE pb.badge = Commitment.Checker_ID) AS Checker_Last_Name, 
(SELECT pb.fname FROM pb WHERE pb.badge = Commitment.Checker_ID) AS Checker_First_Name, 
Reviewer_ID, 
(SELECT pb.lname FROM pb WHERE pb.badge = Commitment.Reviewer_ID) AS Reviewer_Last_Name, 
(SELECT pb.fname FROM pb WHERE pb.badge = Commitment.Reviewer_ID) AS Reviewer_First_Name, 
Approver_ID, 
(SELECT pb.lname FROM pb WHERE pb.badge = Commitment.Approver_ID) AS Approver_Last_Name, 
(SELECT pb.fname FROM pb WHERE pb.badge = Commitment.Approver_ID) AS Approver_First_Name 
FROM Commitment 
WHERE Commitment.Approver_ID IN (SELECT pb.badge FROM pb WHERE pb.dept = ?) ORDER BY Commitment_ID  

Имеет ли мой запрос слишком много подзапросов?

Или я должен нормализовать и разбить 4 значка сотрудника на отдельную таблицу?Если бы я нормализовался, мне кажется, что моей новой таблице для хранения значков понадобился бы какой-то столбец роли, а затем мне понадобилась бы третья таблица соответствия для роли?А затем, чтобы усложнить ситуацию, мне нужно запросить Commitments по Approver_ID, используя переданную в связанную переменную 'dept'.Не уверен, куда идти.

TABLE: commitment_emp
Commitment_ID (PK) (FK) VARCHAR2(10)
badge (PK) VARCHAR2(10)
role (PK) VARCHAR2(20)

1 Ответ

3 голосов
/ 30 июля 2010

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

   SELECT c.originator_id, 
          orig.lname,
          orig.fname,
          c.checker_id,
          check.lname,
          check.fname,
          c.reviewer_id,
          review.lname,
          review.fname,
          c.approver_id,
          approve.lname,
          approve.fname
     FROM COMMITMENT c
LEFT JOIN PB orig ON orig.badge = c.originator_id
LEFT JOIN PB check ON check.badge = c.checker_id
LEFT JOIN PB review ON review.badge = c.reviewer_id
     JOIN PB approve ON approve.badge = c.approver_id
                    AND approve.dept ?
 ORDER BY c.commitment_id

СОЕДИНЕНИЯ и псевдонимы таблиц - ваши друзья - дизайн таблицы в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...