【问题标题】:SQL Join to get min rowSQL Join 以获取最小行
【发布时间】:2021-04-17 03:28:28
【问题描述】:

我有三个表,想要一个每个优先级只显示 1 行的连接。

table Role (AgreementId int, CustomerId int, AgreementRoleId int);
table AgreementRoleGroup (RoleGroupId int, AgreementRoleId int);
table RoleGroup (RoleGroupid int, priority int)

当前查询给出所有行

select * from role r
left join agreementRoleGroup as arg on r.agreementRoleId = arg.agreementRoleId

我做了一个 db fiddle,我希望结果是两行,第一行和接下来的两行。 https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=fea96bb551657bfcce18f9af7f3f2947

【问题讨论】:

  • 得到两行的逻辑是什么

标签: sql tsql


【解决方案1】:

您未定义哪一行的标准,但我假设您想要一组唯一的 AgreementID、CustomerID 和 RoleGroupID,在这种情况下使用:

select distinct r.AgreementID, r.CustomerID, arg.RoleGroupID 
from role r
inner join agreementRoleGroup as arg on r.agreementRoleId = arg.agreementRoleId

【讨论】:

  • 这只是查询的一部分,以简化一点。但是我有很多其他选择,因此由于它们不同而无法解决:/
  • 好吧,仅凭一小部分问题就很难提出完整的解决方案。 GROUP BY 会起作用吗
【解决方案2】:

您可以使用解析函数ROW_NUMBER如下:

select * from
(select r.*, arg.RoleGroupId, 
        row_number() over (partition by rg.priority order by r.AgreementId) as rn
   from role r
   join agreementRoleGroup as arg on r.agreementRoleId = arg.agreementRoleId
   join rolegroup rg on rg.RoleGroupid = arg.RoleGroupId) t
  where rn = 1

db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2021-11-06
    • 2021-05-09
    • 1970-01-01
    • 2018-04-28
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多