我有下面的查詢哪些工作,但我想知道如果它可以更有效。我需要從電話簿表(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)
正如OMG所說的,你的餐桌設計很好 - 它已經*規範化了。 「鑰匙,整個鑰匙,只有鑰匙...」 – 2010-07-30 11:09:14