SQL连接仅1行

时间:2020-10-26 07:44:49

标签: sql tsql

我想基于ViewPriority将表CustomerAgreementRole加入到AgreementRoleGroup中只有一行。示例:CustomerAgreementRole可以具有三行。我只想要ViewPriority最高的加入的行

AgreementId, AgreementRoleId 
1            1
1            2
1            3  

CustomerAgreementRole

 1. AgreementId
 2. AgreementRoleId

AgreementRoleGroup

 1. AgreementRoleId
 2. ViewPriority

当前查询:

select * from CustomerAgreementRole car 
join (select agreementRoleId, min(ViewPriority) as mi from AgreementRoleGroup group by AgreementRoleId) as arg on car.AgreementRoleId = arg.AgreementRoleId

预期结果:

AgreementId, AgreementRoleId, ViewPriority
1            1                1

4 个答案:

答案 0 :(得分:0)

可能是这样的:

git reset --hard develop

答案 1 :(得分:0)

由于AgreementRoleGroup已获得AgreementRoleId,因此我们可以{% for kpi in csf.getKeyPerformanceIndicators%} ... {% endfor %} 进行一些子查询

join

但是我会说使用select a.*, b2.ViewPriority from CustomerAgreementRole a left join ( select b.AgreementRoleId, b.ViewPriority from AgreementRoleGroup b where b.ViewPriority = ( select min(ViewPriority) from AgreementRoleGroup ) ) b2 on a.AgreementRoleId=b2.AgreementRoleId 并不是最好的方法,您应该在@gotqn答案中使用min(),但现在可以使用。

重新编辑

top

我将这些用作示例数据并获得了此结果documentation

如果您只希望一行而不在乎ViewPriority是否需要最小,请改用create table CustomerAgreementRole (AgreementId int,AgreementRoleId int); insert into CustomerAgreementRole values (1,1); insert into CustomerAgreementRole values (2,3); insert into CustomerAgreementRole values (3,4); insert into CustomerAgreementRole values (4,2); create table AgreementRoleGroup (AgreementRoleId int, ViewPriority int); insert into AgreementRoleGroup values (1,3); insert into AgreementRoleGroup values (3,4); insert into AgreementRoleGroup values (4,2); insert into AgreementRoleGroup values (2,1);

top

答案 2 :(得分:0)

对于每个AgreementId,您需要具有最高优先级(最低ViewPriority值)的AgreementRoleId。这意味着您要对CustomerAgreementRole行进行排名,并且仅显示排名最高的行。排名通常是通过SQL中的ROW_NUMBERRANKDENSE_RANK完成的。

select AgreementId, AgreementRoleId, ViewPriority
from
(
  select
    car.AgreementId, car.AgreementRoleId, arg.ViewPriority,
    row_number() over (partition by car.AgreementId order by arg.ViewPriority) as rn
  from CustomerAgreementRole car
  join AgreementRoleGroup arg on arg.AgreementRoleId = car.AgreementRoleId
) ranked
where rn = 1;

答案 3 :(得分:0)

使其与此配合使用:

WITH CTEViewPriority (lowestViewPriority, agreementId) as (
    select min(ViewPriority), AgreementId from CustomerAgreementRole as car 
    left join AgreementRoleGroup arg on car.AgreementRoleId = arg.AgreementRoleId
    group by agreementId
    )
select * from CustomerAgreementRole as car
inner join CTEViewPriority as arg on lowestViewPriority = arg.agreementRoleId and arg.agreementId = car.agreementId