2017-07-02 53 views
0

我们有一个员工类别系统,它将值封装在大约25列中。这些专栏显示了我们的核心系统中的员工可以使用的功能。根据派生列值查找记录

我们要建立一个过程,有人能

  • 供给员工的名单,其中任何一个可以在任何类别
  • 他们指示一个或多个“功能改变”他们想要的雇员拥有

...并且代码将确定任何现有类别是否与列表中的每个员工当前具有启用的新功能的特征相匹配。

到目前为止,我能想到的唯一方法是在请求中循环遍历员工列表的游标,并且每个游标都根据当前列值构建一个SELECT字符串,覆盖变化中的所有功能请求,然后动态运行并从我们的类别表中返回选择,以查看是否有任何匹配项。

我想知道是否有更好的方法?

我们的数据的一个简单的例子:

Categories table: 

    Category Feature1 Feature2 Feature3 
    Cat1  Yes  No  1 
    Cat2  Yes  Yes  1 
    Cat3  No  No  2 

Employees table: 

    EmployeeId Category 
    Emp1  Cat1 
    Emp2  Cat2 

在上面的例子,如果我们要求,看是否有类存在于其中EMP1可以保留他们现有的所有功能,但启用特点2(以这个例子'是'),那么代码需要确定Cat2是一个合适的类别(如果没有合适的类别存在于现有的和新的特征中,那么我们建议请求者需要要求创建一个新的类别)。

回答

2

您不需要按需构建SQL。 (如果你喜欢的或NVL)你可以这样做此绑定变量和COALESE:

SELECT Category 
FROM categories c1 
JOIN employee e ON 1=1 
JOIN categories c2 ON e.category = c2.category 
WHERE e.employeeID = ? 
    AND c1.feature1 = COALESCE(?, c2.feature1) 
    AND c1.feature2 = COALESCE(?, c2.feature2) 
    AND c1.feature3 = COALESCE(?, c2.feature3) 

然后使用雇员,new_feature1,new_feature2,new_feature3等为绑定值。如果新值为NULL,则将使用旧值。

+0

我想你可能只是摇动了我的世界。需要确认,但有信心我会回来标记这是答案。 – MidnightThoughtful

+0

问题:是否应该有第二个'ON'参数(加入c1的东西)?我无法从概念上把这个工作。 – MidnightThoughtful

+0

是的,应该有一个“JOIN员工ON 1 = 1”或在Oracle下可以使用“CROSS JOIN员工”。基本上,它的工作原理是这样的:以当前员工和他的类别(c2),然后针对所有可用类别进行交叉连接。然后过滤掉那些功能与新绑定变量类别不匹配的类别,如果前者为空,则过滤掉旧的旧类别。 – fhossfel