我有以下表格:
Projects (ID, Name, ManagerUser_ID)
Users(ID, Name, Active)
Delegates(ProjectID, UserID, OrderNo)
ManagerUser_ID
是项目的项目经理,是指向users表的链接。但是,用户可以是Inactive
。因此,Delegates表是定义可以访问项目数据的用户的多对多表。
我需要的是选择Active
项目的第一个代表,假设经理是Inactive
。 OrderNo
字段指定代理的顺序(1是第一个)。
一些示例数据:
Project
1, Project1, 2
2, Project2, 4
3, Project3, 1
Users
1, Joe, true
2, John, false
3, Dave, true
4, Bob, false
Delegates
1, 4, 1
1, 1, 2
1, 3, 3
2, 2, 1
2, 4, 2
2, 3, 3
因此我的查询输出需要显示:
Project1, Joe
Project2, Dave
Project3, Joe
显示每个项目的项目和用户,如果ManagerUser_ID
处于非活动状态,请选择User
Delegates
OrderNo
Active
{{1}} {{1}}
答案 0 :(得分:1)
我认为这将是这样的。我们的想法是进行额外的连接(使用左连接)来查找更早的有效行。如果你能找到那一行,那么显然你正在构建的当前行不是你想要的那一行:
select p.Name,m.Name from Projects p inner join Users m on p.ManagerUser_ID = m.ID and m.Active = 1
union all
select
p.Name,
u.Name
from
Projects p
inner join
Delegates d
on
p.ID = d.ProjectID
inner join
Users u
on
d.UserID = u.ID and
u.Active = 1
left join
Delegates d_anti
inner join
Users u_anti
on
d_anti.UserID = u_anti.ID and
u_anti.Active = 1
on
p.ID = d_anti.ProjectID and
d_anti.OrderNo < d.OrderNo
where
u_anti.ID is null
答案 1 :(得分:1)
Select projectName, userName
From
(
Select projectName, userName, row_number() over (partition by projectName order by priority ASC) as rank
From
(
SELECT p.name as projectName, u.name as userName, 1 as priority
FROM projects p INNER JOIN users u ON u.active = true and u.id = p.ManagerUser_ID
UNION
SELECT TOP(1) p.name, u.name, 2
FROM Delegates d INNER JOIN projects p ON p.id = d.projectId
INNER JOIN users u ON u.id = d.userId
Where u.active = true
Order by u.OrderNo ASC
)
)
where rank = 1
答案 2 :(得分:1)
这似乎可以解决问题(使用窗口函数)
SELECT P.Name, ISNULL(U.Name, FirstDelegate.Name) AS ProjManager
FROM Projects P LEFT OUTER JOIN
Users U ON P.ManagerUser_ID = U.ID AND U.Active = 1 LEFT OUTER JOIN
(
SELECT * FROM
(
SELECT D.ProjectID,
US.Name,
ROW_NUMBER() OVER (PARTITION BY ProjectID ORDER BY OrderNo) AS SeqNo
FROM Delegates D INNER JOIN
Users US ON D.UserID = US.ID
WHERE US.Active = 1
) AS Del
WHERE Del.SeqNo = 1
) AS FirstDelegate ON P.ID = FirstDelegate.ProjectID
答案 3 :(得分:0)
select p.name,
u.name,
min(d.orderNo)
from projects p,
users u,
users manager,
delegates d
where p.ManagerUser_ID = manager.id
and manager.active = false
and p.id = d.projectId
and d.userid = u.id
group by p.name,
u.name