2010-07-29 70 views
2

我有下面的查询哪些工作,但我想知道如果它可以更有效。我需要从电话簿表(PB)是谁的徽章(员工ID)的4名员工的姓和名都存储在承诺表带有子查询的Oracle sql查询还是应该正常化?

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_ID的Commitments。不知道要走哪条路。

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

正如OMG所说的,你的餐桌设计很好 - 它已经*规范化了。 “钥匙,整个钥匙,只有钥匙...” – 2010-07-30 11:09:14

回答

3

用途:

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 

连接和表的别名是你的朋友 - 表的设计是好的。

+0

真棒谢谢。我的查询时间下降了6倍!我必须在SELECT语句中添加'approve.dept'以使其工作,并在所有lname/fname(即orig.lname作为orig_lname)上添加别名。如果没有别名,检查器,审阅者,审批者的f/l名称将作为始发者输出 – jeff 2010-07-30 14:09:11