提问人:SF1 提问时间:11/12/2023 最后编辑:Chris SchallerSF1 更新时间:11/12/2023 访问量:96
将列表与 MS Azure sql 中的第二个列表进行比较 [已关闭]
Compare list with a second list in MS Azure sql [closed]
问:
这是在 Microsoft Azure 中。我有一个报告列表,其中包含与之关联的特定组织。例如
CREATE TABLE Reports (
reportId INT,
OrganizationID INT
);
INSERT INTO Reports (reportId, OrganizationID) VALUES
(1, 1),
(1, 2),
(2, 1),
(3, 1),
(3, 2),
(3, 3);
我还有一个与组织关联的用户表。例如:
CREATE TABLE Users (
User CHAR(1),
OrganizationId INT
);
INSERT INTO Users (User, OrganizationId) VALUES
('a', 1),
('a', 2),
('b', 2),
('c', 1),
('c', 2),
('c', 4);
我需要做的是根据他们的组织确定谁有权访问哪个报告 - 用户必须拥有报告中列出的所有组织才能访问该报告。因此,根据上述数据,我希望看到用户 a 可以访问报表 1 和报表 2,用户 b 无法访问任何报表,而用户 c 可以访问报表 1 和报表 2。
输出示例:
用户 | ReportId |
---|---|
一个 | 1 |
一个 | 2 |
c | 1 |
c | 2 |
我知道我可以使用 SQL 逐个循环访问报告,以确定谁有权访问哪个报告,有没有办法在不循环报告的情况下做到这一点,而只是在直接 SQL 中?将不胜感激!提前致谢。
答:
0赞
Adrian Maxwell
11/12/2023
#1
若要确定用户是否对报表涵盖的所有组织具有权限,请使用 and 子句的组合。在这里,它将用户拥有的组织数与报表涵盖的组织数进行比较(请注意,联接条件要求组织每行匹配)。group by
having
SELECT
r.reportId
, u.User_
FROM Reports r
INNER JOIN Users u ON r.OrganizationID = u.OrganizationId
GROUP BY
r.reportId
, u.User_
HAVING COUNT(DISTINCT r.OrganizationID) = (
SELECT COUNT(DISTINCT OrganizationID)
FROM Reports r2
WHERE r2.reportId = r.reportId
)
报告 ID | 用户_ |
---|---|
1 | 一个 |
1 | c |
2 | 一个 |
2 | c |
请参阅此 SQL Server 小提琴
请注意,该子句旨在允许通过聚合值进行过滤。因此,它位于条款之后,绝对不能替代条款。您可以在同一查询中使用两者。having
group by
where
评论
0赞
SF1
11/12/2023
所需的结果只是 userid,然后是 reportid - 您的建议将向我显示用户 b 和报告 1,即使他们只列出了其中一个组织。用户必须关联所有组织才能与该报表相关联。
0赞
Adrian Maxwell
11/12/2023
对不起 - 错过了那个细节 - 答案已被重写。
0赞
SF1
11/12/2023
谢谢 - 但我认为这仍然行不通。用户 c 有三个关联的组织 (1,2,3),但报告只有 1 和 2 - 用户 c 仍应获得访问权限,因为他的两个组织都在报告中 - 我不能使用 count,因为即使计数相同,也不一定是相同的组织。
0赞
SF1
11/12/2023
抱歉 - 我编辑了用户 C 以拥有第三个组织以显示另一个场景 - 如果 C 有三个组织 (1,2,4),他仍应该可以访问报告 1 和 2。他也有 3 个组织,报告 3 有 3 个组织 - 但即使计数相同,它们也是不同的组织,所以他不应该得到报告 3。
0赞
Adrian Maxwell
11/12/2023
内部联接仅强制要考虑匹配的行,因此用户的组织数量是否多于报表并不重要,但相反,它确实很重要,因此查询需要调整。表已交换,联接更改为左联接,计数现在使用 distinct。
评论