SQL查询选择多行,其中'字段'等于'值'然后添加与结果关联的其他ID

时间:2015-03-20 00:44:32

标签: sql oracle

我有一个users表,其中包含人员及其状态。 ID字段不是唯一的。

ID | Name | Status
1  | Jon  | Online
2  | Ken  | Away
3  | Kim  | Online
4  | Van  | Offline
1  | Jon  | NULL
2  | Ken  | NULL
3  | Kim  | NULL
4  | Van  | NULL
1  | Jon  | Online

在这种情况下,我想让在线的用户和此表中用户的所有其他相同ID形成这样的形式。

ID | Name | Status
1  | Jon  | Online
1  | Jon  | Online
1  | Jon  | NULL
3  | Kim  | Online
3  | Kim  | NULL

有没有办法用一个select语句来获得这个结果?

2 个答案:

答案 0 :(得分:2)

如果没有登录时间戳,它不会向您提供有关您希望如何为某人获取最新活动的详细信息。如果他们可以有3行,你怎么知道哪一个意味着他们在线,哪一个意味着他们在线。

http://sqlfiddle.com/#!6/3833e/4<<< MS SQL安装程序

http://sqlfiddle.com/#!4/f190f/2<<< Oracle SQL安装程序

Fiddle以按人员分组的最近登录的降序为您提供给人。如果您只想获取最新的登录信息,请使用SQL端的第二个选择。

SELECT t1.ID
    , t1.Name
    , t1.Status
    , t1.OnlineTimeStamp
    , ROW_NUMBER() OVER ( PARTITION BY t1.ID ORDER BY t1.OnlineTimeStamp DESC ) AS rn
FROM Test_Client t1
WHERE EXISTS ( SELECT 1 FROM Test_Client t2 WHERE t2.ID = t1.ID AND t2.Status = 'Online' )
ORDER BY t1.ID, rn

;

SELECT tcSub.ID
    , tcSub.Name
    , tcSub.Status
FROM (
    SELECT t1.ID
        , t1.Name
        , t1.Status
        , t1.OnlineTimeStamp
        , ROW_NUMBER() OVER ( PARTITION BY t1.ID ORDER BY t1.OnlineTimeStamp DESC ) AS rn
    FROM Test_Client t1
    WHERE EXISTS ( SELECT 1 FROM Test_Client t2 WHERE t2.ID = t1.ID AND t2.Status = 'Online' )
    ) tcSub
WHERE tcSub.rn = 1
ORDER BY tcSub.ID

答案 1 :(得分:1)

有几种方法可以做到这一点 - 一种是使用exists

select id, name, status
from users u
where exists (
    select 1
    from users u2 
    where u.id = u2.id and u2.status = 'Online'
    )

这是使用in的版本(虽然我更喜欢先前的版本):

select id, name, status
from users
where id in (
    select id
    from users 
    where status = 'Online'
    )