视图的t-sql联接查询

视图的t-sql联接查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试为视图编写查询,但我没有掌握它。 我有两张桌子 user_roles id user_id role_id 1 1 4 2 1 1 3 1 2 4 1 3 user_roles_hst id UserRolesID RoleEnabled creator 1

我正在尝试为视图编写查询,但我没有掌握它。 我有两张桌子

         user_roles
    id  user_id   role_id                
    1     1        4
    2     1        1
    3     1        2
    4     1        3

        user_roles_hst
    id  UserRolesID  RoleEnabled     creator
     1     1              1            1    
     2     1              0            1    
     3     1              1            1    
     4     2              0            1    
     5     2              1            1    
     6     3              0            1
     7     4              0            1
现在我想要一个包含所有用户角色及其最新启用状态的视图 像这样

user_roles_hst存储启用或禁用时角色状态更改的历史记录,但在vw_user_roles中,我需要每个角色或角色id的最新状态

查询:

select * from 
(select x.user_id, x.UserRolesID, x.RoleEnabled from 
(select h.id, u.user_id, h.UserRolesID, h.RoleEnabled from UserRoles u, UserRoles_HST h 
where u.id = h.UserRolesID
group by h.id, h.UserRolesID, h.RoleEnabled, u.user_id
) x
order by x.id desc
) y
group by y.user_id, y.UserRolesID, y.RoleEnabled
我尝试了上面的查询,但后来我意识到我不能在子查询中使用orderby


我需要有关如何获得正确查询的帮助。

每个用户id的vw用户角色的最大id:

SELECT max(id) as maxID FROM user_roles_hst GROUP BY userRolesID;
使用它从表中获取每个
maxID
的记录:

SELECT t2.user_id, t1.UserRolesID, t1.rolesEnabled
FROM user_roles_hst t1
    INNER JOIN user_roles t2 ON
        t1.userRolesID = t2.role_id
WHERE id IN (SELECT max(id) as maxID FROM user_roles_hst GROUP BY userRolesID);
我假设:

  • creator
    实际上是用户
  • userRoleId
    是用户角色
  • “最新”是指“最大的id”
然后您可以使用
行编号()


对于roleid 4,它的RoleEnabled为1?它应该是0。如果对每个启用或禁用的角色也使用
top 1
,则可以在子查询中使用
order by
,将创建一条新记录,并且该记录根据所做的操作有1表示启用或2表示禁用。角色的列是什么?用户历史记录表中的列是什么?角色4是如何启用设置为1的?示例历史记录中唯一的“4”已启用为0。
user\u roles\u hst
如何存储没有日期的历史记录?你只是假设
user\u roles\u hst.id
的最大值必须是最后添加的吗?这只给了我一条记录,我期望正好是4条,即
user\u roles
中的所有记录我也喜欢这一条,
outer\u apply
处理
user\u roles
中的记录,而不是
user\u roles\u hst
SELECT t2.user_id, t1.UserRolesID, t1.rolesEnabled
FROM user_roles_hst t1
    INNER JOIN user_roles t2 ON
        t1.userRolesID = t2.role_id
WHERE id IN (SELECT max(id) as maxID FROM user_roles_hst GROUP BY userRolesID);
select urh.creator as user_id, userRoleId, as role_id, role_enabled as enabled
from (select urh.*,
             row_number() over (partition by creator, userRoleId order by id desc) as seqnum
      from user_roles_hst urh
     ) urh
where seqnum = 1;
Declare @user_roles table (id int, user_id int, role_id int)
Declare @user_roles_hst table (id int, userrolesid int, roleenabled int, creator int)

insert into @user_roles values
(1,1,4),
(2,1,1),
(3,1,2),
(4,1,3)

insert into @user_roles_hst values
(1, 1, 1, 1),
(2, 1, 0, 1),
(3, 1, 1, 1),
(4, 2, 0, 1),
(5, 2, 1, 1),
(6, 3, 0, 1),
(7, 4, 0, 1)

select ur.user_id,ur.role_id,x.roleenabled
from @user_roles ur
join (
Select row_number() over (partition by userrolesid order by id desc) rn,*
from @user_roles_hst) x on ur.id = x.userrolesid
where rn = 1
    declare @user_roles table ( id  int, user_id int, role_id  int);
    insert into @user_roles values            
        (1,     1,        4),
        (2,     1,        1),
        (3,     1,        2),
        (4,     1,        3)

    declare @user_roles_hst table (id  int, UserRolesID int, RoleEnabled  int,  creator int);
    insert into @user_roles_hst values
         (1,     1,              1,            1),    
         (2,     1,              0,            1),   
         (3,     1,              1,            1),    
         (4,     2,              0,            1),    
         (5,     2,              1,            1),    
         (6,     3,              0,            1),
         (7,     4,              0,            1)

    select r.user_id,    
           r.role_id, 
           a.RoleEnabled
    from @user_roles r outer apply (select top 1 *
                                    from @user_roles_hst h
                                    where h.UserRolesID = r.id
                                    order by id desc) a;