我想获得有关优化我的查询的帮助。
我希望有一个多年来暴露员工数据的视图。此视图包含employee表中的数据,其中employeeID,year和employee demographs为columns。我还有一个名为testemployees的表,它有EmployeeID和Year。这是employee表的子集,可能有也可能没有数据。我想要完成的是:
如果testEmployees表中有数据,我的视图应仅为testEmployees中的员工获取员工详细信息,如果testEmployees中没有数据,我应该让我的视图包含employee表中的所有数据。
我的员工表非常庞大,即使下面的查询有效,也需要花费大量时间来获取此数据。任何有关如何改进此查询的指示都将不胜感激。
Create view dbo.employees(Year, EmployeeID)
as
select * from
employee e, testemployees te
where e.Year = case when((select count(1) from testemployees)>0) then te.Year else e.Year
and e.employeeID = case when((select count(1) from testemployees)> 0) then te.employeeID else e.employeeID
让我知道您对如何优化查询的想法。使用任何其他类型的连接会有帮助吗?
提前致谢。
答案 0 :(得分:0)
自从我使用Sybase以来已经有一段时间了,我不太确定他们对SQL-99查询的语法支持。但是,假设Sybase至少支持SQL-99连接语法,则以下内容应该有效:
Create view dbo.employees(Year, EmployeeID)
as
select e.employeeId, e.Year, e.attribute1, e.attribute2, ... e.attributeN,
ifnull(te.employeeId, e.employeeId, te.employeeId) as testEmployeeId,
ifnull(te.employeeId, e.Year, te.Year) as testYear,
ifnull(te.employeeId, e.attribute1, te.attribute1) as testAttribute1,
ifnull(te.employeeId, e.attribute2, te.attribute2) as testAttribute2,
....
ifnull(te.employeeId, e.attributeN, te.attributeN) as testAttributeN
from employee e
left join testemployees te on (e.employeeId = te.employeeId and e.Year = te.Year)
请注意,这与您定义的语义有些不同。我猜这在某种情况下实际上更接近你想要的东西。