我有一个初学者问题,我需要验证查询是否会返回正确的结果给出以下设置。 表1:员工表:主键 - 员工ID
e.g.
Employee ID Name
1010 JohnDoe
1020 JaneDoe
1030 JimDoecode here
表2:顾问表 - 主要顾问ID e.g。
Consultant ID Name
2020 Stack1
2030 Stack2
2040 Stack3
表3:用户表 - 主要ID - 用户ID,外键:员工ID,顾问ID e.g。
User ID EmployeeID ConsultantID Status
5020A 1010 Active
5030B 1020 Inactive
5040C 1030 Active
6050A 2020 Inactive
6060B 2030 Active
6070C 2040 Active
帐户表 - 主要ID - Accountid,Foreignkeys:员工ID,顾问ID
AccountID EmployeeID ConsultantID
AABB1 1010
BBCC2 1020
CCDD3 1030
DDEE4 2020
EEFF5 2030
FFGG6 2040
如果我是员工,不知何故也是顾问,反之亦然,我将有一个employeeid和consultantID以及两个用户ID。
我的查询需要从Users表返回活动用户并显示AccountID,Userid,Employeeid,Consultantid和Name。
Such as:
User ID AccountId EmployeeName ConsultantName
5020A AABB1 JohnDoe
5040C CCDD3 JimDoe
6060B EEFF5 Stack2
6070C FFGG6 Stack3
如果没有对表的深入了解,那么进行
之类的连接会是错误的where users.employeeid=employee.employeeid
and users.consultantid=consultant.consultantid
和帐户表相同? 以这种方式连接表是否有效?或者更好地利用子查询?我以这种方式加入了表格,表现非常糟糕。
答案 0 :(得分:0)
我不会说你所做的是错误 - 数以万计的Oracle查询以这种方式运行(并且可能会继续这样做)。虽然,我同意 - 如果您习惯使用ANSI连接语法,它会更好 ,因为它更易于阅读,您可以将连接与条件<分开/ em>(放在WHERE子句中),更不用说使用旧的Oracle外连接(+)运算符将同一个表外连接到两个(或更多)其他表的不可能(字面上)任务。
优化程序无论如何都会重写你的代码,只要它得出的结论是如果它能够获得更好的性能。
现在,作为一个糟糕的表现,你 - 至少 - 在你指定的那4列上创建了索引吗?如果没有,请尝试再次运行查询(多次)并比较执行时间。
收集统计信息,以便(先前提到的)优化器具有完成其工作所需的数据。
检查执行计划 - 它也可能会显示一些有用的信息。
完成所有这些后的任何改进?