带子查询的Oracle sql查询还是应该规范化?

带子查询的Oracle sql查询还是应该规范化?,sql,oracle,database-design,plsql,Sql,Oracle,Database Design,Plsql,我有下面的查询,但我想知道它是否能更有效。我需要电话簿表(pb)中4名员工的名字和姓氏,他们的徽章(员工ID)存储在承诺表中 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

我有下面的查询,但我想知道它是否能更有效。我需要电话簿表(pb)中4名员工的名字和姓氏,他们的徽章(员工ID)存储在承诺表中

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个员工徽章放在一个单独的表中?如果我要规范化,那么我存储徽章的新表似乎需要某种角色列,然后我需要第三个角色查找表吗??然后让事情复杂化,我需要使用传入的绑定变量'dept'通过Approver\u ID查询承诺。不知道该走哪条路

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


联接和表别名是您的朋友-表设计很好。

正如OMG所说,您的表设计很好-它已经正常化了。“钥匙,整个钥匙,除了钥匙什么都没有……”太棒了,谢谢。我的查询时间减少了6倍!我必须在SELECT语句中添加“approve.dept”以使其正常工作,并在所有lname/fname(即orig.lname as orig_lname)上添加别名。如果没有别名,检查人、审核人、批准人的f/L名称将作为发起人输出
   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