代码之家  ›  专栏  ›  技术社区  ›  jeff

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

  •  2
  • jeff  · 技术社区  · 16 年前

    我有下面的查询,但我想知道它是否可以更有效。我需要电话簿表(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  
    

    我的查询有太多子查询吗?

    TABLE: commitment_emp
    Commitment_ID (PK) (FK) VARCHAR2(10)
    badge (PK) VARCHAR2(10)
    role (PK) VARCHAR2(20)
    
    1 回复  |  直到 16 年前
        1
  •  3
  •   OMG Ponies    16 年前

    用途:

       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
    

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