我正在尝试使用C#WPF视图显示员工属性。我的数据库中的其他Oracle表中都有数据。
尽管有一组多个表,但每个表都由相同的结构组成。这些表结构在高层是...
表结构
Employee table columns (EMP table) : ID, Name, Organisation
Employee properties table columns (EMPPR table): ID, PropertyName, PropertyValues
EMP表中的每个员工ID和姓名,以及EMPPR表中的每个员工属性。每位员工的属性在40-80之间,即EMPPR表中每位员工40-80行。
像这样,每个部门都有一组表。即(DEVEMP,DEVEMPPR)
,
(HREMP,HREMPPR)
,
(ADMINEMP, ADMINEMPPR)
,
(FINEMP, FINEMPPR)
,
(ADMINEMP, ADMINEMPPR)
等...
我需要一次获取多个部门的员工属性,以获取明智的部门名称列表。
我正在使用以下查询来获取输入名称的员工属性,如下所示:
SELECT Pr.PropertyName, Pr.PropertyValue
FROM DEVEMP Emp
JOIN DEVEMPPR Pr ON Emp.ID = Pr.ID
AND Emp.Name IN (<List of DEV Names Inputted>)
像这样,我需要为每个部门执行。
如果我对所有部门表查询使用 UNION ALL 并在组合列表中使用 IN 条件,查询是否有效?
使用UNION ALL查看
CREATE OR REPLACE FORCE VIEW EMPPRVIEW(NAME, PRNAME, PRVALUE) AS
SELECT Emp.Name, Pr.PropertyName, Pr.PropertyValue
FROM DEVEMP Emp
JOIN DEVEMPPR Pr ON Emp.ID = Pr.ID
UNION ALL
SELECT Emp.Name, Pr.PropertyName, Pr.PropertyValue
FROM HREMP Emp
JOIN HREMPPR Pr ON Emp.ID = Pr.ID
UNION ALL
SELECT Emp.Name, Pr.PropertyName, Pr.PropertyValue
FROM ADMINEMP Emp
JOIN ADMINEMPPR Pr ON Emp.ID = Pr.ID
UNION ALL
.
.
.
从视图中查询
SELECT NAME, PRNAME, PRVALUE
FROM EMPPRVIEW
WHERE NAME IN (<Combined list of names from each dept>)
方法2易于实现,因为我们可以立即执行查询,但是我认为它会降低查询性能。
哪种方法最好使用 UNION ALL 进行单个查询,或者对每个部门分别执行查询?
PS。输入的雇员姓名列表可以包含每个部门的1000个姓名,每个雇员具有40-80个属性。
答案 0 :(得分:1)
我同意MatBailie的意见;这应该作为单个Employee表中的一列完成。您可以将其更改为该样式,并创建可镜像的现有表结构的可更新视图,以便应用程序在将其切换为使用员工统一统一表的同时继续工作
关于查询效率和大概性能的问题,您将不得不对其进行测试。我只预见到如果在联合操作期间oracle不在每个表上使用索引,则性能会出现问题。
因此,回答您的问题:它会起作用,但是您应该考虑更改结构,而不是一味地坚持寻找有问题的初始设计决策的方法。知道它是否可以满足您的要求的唯一方法是对其进行压力测试