2010-07-29 29 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