我有下面的查询哪些工作,但我想知道如果它可以更有效。我需要从电话簿表(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