2014-09-10 44 views
0

我已经具有以下的表:如何基于优先级字段中选择一个成功的记录

eIDPK),memberIDPK),eNamepriorityqualified

可以有多个记录为特定的eID,memberID组合但每个都有不同的优先级,所以像这样

1234, jsmith, news,   1, NULL 
2345, jsmith, reactivation, 2, NULL 

我需要编写一个查询,将评价表中的行,并指定基于优先级的合格列,因此结果会

1234, jsmith, news,   1, Y 
2345, jsmith, reactivation, 2, N 

因此,为了使问题复杂化我的表将行添加到它贯穿整天,每次添加一组新数据时,我都需要重新运行优先级查询。

一个令人讨厌的笔记,我不能使用游标,变量或临时表来做到这一点。我可以创建支持表并将数据临时复制给它们,但它们将是物理表。

任何帮助,将不胜感激。如果我对这个问题的描述很糟糕,我很抱歉,让我知道我可以怎样更具说服力,我会尽我所能。

感谢

+1

我想你需要描述每个eid/memberid组合的优先级分配方式以及如何选择获胜记录。这听起来像运行更新查询的触发器可以工作。另外,请为您正在使用的特定数据库管理系统添加标签(最好使用版本)。 – jpw 2014-09-10 18:45:55

回答

0

如果我理解正确的问题,我觉得这个SQL会给你你想要

UPDATE MyTable SET qualified='N' 
UPDATE MyTable 
SET MyTable.qualified = 'Y' 
FROM MyTable 
INNER JOIN (select memberID, MIN([priority]) as [priority] FROM MyTable GROUP BY memberID) T2 
ON T2.memberID=MyTable.memberID AND T2.priority = MyTable.priority 

给它一个镜头,看看我是否正确理解要求

0

什么以不合格为基础名称的名称,我会在顶部创建一个视图。

在您的案例中,视图的优势在于您不必在新成员/优先级记录添加时重新计算合格的条目,因此结果始终为“实时”。

您可以在基础表上添加一个already_processed_flag,并在视图上添加逻辑来处理该问题。

create view qualified_view 
(eid, memberId, ename, priority, qualified) 
as 
select eid, memberId, ename, priority, 'Y' as qualified 

from unqualified 
where not exists 
/* is there anything @ higher priority? */ 

(select 1 from unqualified s 
where s.memberId = unqualified.memberId 
where s.eid <> unqualified.eid and s.priority > unqualified.priority 
) 

union 

select eid, memberId, ename, priority, 'N' as qualified 

from unqualified 
where exists 
(select 1 from unqualified s 
where s.memberId = unqualified.memberId 
where s.eid <> unqualified.eid and s.priority > unqualified.priority 
) 

现在工会在那里处理的情况下,有更紧急的事情,如果没有,不知道你要瞄准哪个数据库。

在Oracle例如,你可以使用NVL,这样代替(语法错误是可能的,这样做写意):

create view qualified_view 
(eid, memberId, ename, priority, qualified) 
as 
    select eid, memberId, ename, priority, 
NVL((select 'Y' from unqualified s 
where s.memberId = unqualified.memberId 
where s.eid <> unqualified.eid and s.priority > unqualified.priority 
limit 1 
),'N') as qualified 
from unqualified 

MS SQLServer的具有粗糙相当于NVL,则isNull。其他RDBMS可能有也可能没有类似的东西。