如何检索具有最小值的记录

问题描述 投票:0回答:1

有以下逻辑。 我不明白为什么查询会同时检索 '2',NY 和 3,'MA' 记录 不仅是'2','NY'记录。

create table dbo.DMDAddressCity
(
    AddressCd char(3),
    AddressCity varchar(20)
)
insert DMDAddressCity
select 'NY','New York'
insert DMDAddressCity
select 'MA','Boston'

create table dbo.DMDAddressPriority
(
    PriorityId tinyint NOT NULL,
    AddressCd char(3)
) 

insert DMDAddressPriority
select 1,'NJ'
insert DMDAddressPriority
select 2,'NY'
insert DMDAddressPriority
select 3,'MA'

select PR.PriorityId, PR.AddressCd
from DMDAddressPriority PR
join DMDAddressCity CT
on
    CT.AddressCd = PR.AddressCd 
where PriorityId = 
(
    select min(PriorityId)
    from DMDAddressPriority PR2
    where           
        --trim(PR.AddressCd) = trim(PR2.AddressCd)  
        PR.AddressCd = PR2.AddressCd 
) 

我希望仅检索 1 条具有最小 priorityid 的记录。 感谢对我做错了什么的一些指导。

min
1个回答
0
投票

您的子查询引用外部查询并找到最小优先级,其中

PR.AddressCd = PR2.AddressCd
。当然,NY的
addresscd
最小为2,MA的
addresscd
最小为3,所以都选了

要获得整个表的最小值,您不需要子查询中的

PR.AddressCd = PR2.AddressCd
条件。然而……

where PriorityId = 
(
    select min(PriorityId)
    from DMDAddressPriority PR2
)

...不会做你想做的,因为它会在表 (1) 中获得绝对最小值,你的记录都不匹配。您需要获得您正在考虑的记录的绝对最小值。我建议考虑更多的东西:

WITH cte AS
(
 select PR.PriorityId, PR.AddressCd
 from DMDAddressPriority PR
 join DMDAddressCity CT
  on CT.AddressCd = PR.AddressCd
)
SELECT *
FROM cte
WHERE priority = (SELECT min(priorityid) FROM cte)

SELECT PriorityId, AddressCd
FROM
(
 select PR.PriorityId, PR.AddressCd, min(PR.PriorityId) OVER() MinPriorityId
 from DMDAddressPriority PR
 join DMDAddressCity CT
  on CT.AddressCd = PR.AddressCd
)
WHERE PriorityId = MinPriorityId
© www.soinside.com 2019 - 2024. All rights reserved.