【问题标题】:Oracle sql query with subqueries or should I normalize?带有子查询的 Oracle sql 查询还是我应该规范化?
【发布时间】:2011-03-22 23:08:48
【问题描述】:

我有以下查询,但我想知道它是否可以更有效。我需要电话簿表 (pb) 中 4 名员工的名字和姓氏,他们的徽章(员工 ID)存储在 Commitment 表中

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 查询承诺。不知道该走哪条路。

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

【问题讨论】:

  • 正如 OMG 所说,您的表格设计很好 - 它已经 标准化了。 “钥匙,整个钥匙,只有钥匙……”

标签: sql oracle database-design plsql


【解决方案1】:

用途:

   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

JOIN 和表别名是你的朋友 - 表设计很好。

【讨论】:

  • 非常感谢。我的查询时间减少了 6 倍!我必须在 SELECT 语句中添加“approve.dept”以使其工作并在所有 lname/fname 上添加别名(即 orig.lname 作为 orig_lname)。如果没有别名,则 checker、reviewer、approver 的 f/lname 将作为发起人输出
猜你喜欢
  • 2013-02-15
  • 2014-10-31
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多