11

我有一个有大量行(> 10K)的表。大多数行都有与用户名关联的重复角色值。

我要做的是按request_id添加的不同和最新角色选择行。我几乎拥有它,但让我大吃一惊的部分是某些request_id字段中有值,因为这些请求是在添加该列之前发出的。我仍然需要将它们包括在内,以防用户在更新后没有输入另一个请求。nullselect statement

这是我的表结构的示例:

 id | uname  | role    | request_id
 0  | jsmith  | User   | null
 1  | jsmith  | Admin   | null
 2  | jsmith  | Dude    | null
 3  | jsmith  | Admin   | 56
 4  | jsmith  | Dude    | 56
 5  | jsmith  | Admin   | 57
 6  | jsmith  | Dude    | 57

这将是期望的结果:

0  | jsmith  | User    | null
5  | jsmith  | Admin   | 57
6  | jsmith  | Dude    | 57

以下是我迄今为止尝试过的陈述:

加入

select distinct a.uname, a.role, a.request_id from (
    select * from  das_table 
    ) 
b join das_table a on b.role = a.role and b.request_id = a.request_id
where a.uname = 'jsmith'

结果:这消除了request_id =NULL

最大限度()

我猜这对我不起作用,因为MAX()不计算null值?

select distinct uname, role, max(request_id) as request_id from das_table where uname='jsmith'
group by uname, role, request_id

我看过的类似问题:

我认为与我研究过的其他问题不同的一个问题是request_id有可能为空。

从 1 列中选择不同的值| SQL Server:按一列和另一列值选择不同| SQL Server 选择不同的地狱

4

2 回答 2

17

max查询无效,因为您包含在request_id分组中 - 尝试:

select distinct uname, role, max(request_id) as request_id 
from das_table where uname='jsmith'
group by uname, role

SQLFiddle在这里

于 2013-06-06T15:52:00.990 回答
1

似乎 ISNULL 可以解决您的问题,为了简单起见,我在这里使用 1 但如果这对您的使用更有意义,您可以使用 -1。

MAX(ISNULL(request_id, 1))
于 2013-06-06T15:45:11.943 回答