将列表与 MS Azure sql 中的第二个列表进行比较 [已关闭]

Compare list with a second list in MS Azure sql [closed]

提问人:SF1 提问时间:11/12/2023 最后编辑:Chris SchallerSF1 更新时间:11/12/2023 访问量:96

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

11天前关闭。

这篇文章是在 11 天前编辑并提交审核的。

这是在 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 中?将不胜感激!提前致谢。

SQL-Server Azure

评论

2赞 Yitzhak Khabinsky 11/12/2023
在提出问题时,您需要提供一个最小的可重现示例:(1) DDL 和示例数据填充,即 CREATE 表和 INSERT T-SQL 语句。(2) 需要执行的操作,即逻辑和代码尝试在 T-SQL 中实现它。(3) 期望的输出,基于上面 #1 中的示例数据。(4) 您的 SQL Server 版本 (SELECT @@version;)。
0赞 Chris Schaller 11/12/2023
您确实需要提供一个输出示例,以确保当请求不是 100% 清晰时,我们不会迷失方向

答:

0赞 Adrian Maxwell 11/12/2023 #1

若要确定用户是否对报表涵盖的所有组织具有权限,请使用 and 子句的组合。在这里,它将用户拥有的组织数与报表涵盖的组织数进行比较(请注意,联接条件要求组织每行匹配)。group byhaving

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 小提琴

请注意,该子句旨在允许通过聚合值进行过滤。因此,它位于条款之后,绝对不能替代条款。您可以在同一查询中使用两者。havinggroup bywhere

评论

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。