在 SQL 服务器中执行 SELECT 语句时,如何在使用 INNER JOIN 时只包含一个匹配项?

How can I only include one match when using INNER JOIN while doing SELECT statement in SQL Server?

SELECT distinct
    sr.ServiceDescription,
    os.ServiceID
FROM            
    OrderedServices as os           
INNER JOIN
    Orders as o ON o.OrderID = os.OrderID
INNER JOIN
    ServiceRelation as sr ON os.ServiceID = sr.ServiceID
WHERE 
    o.OrderID = 2802882;

假设这个 return 是这样的:

Service Description  | ServiceID
--------------------------------
Basic Cable          | 2
Extended Cable       | 5
ExtendedPlus Cable   | 5
Everything Cable     | 10

但是,如果两个 ServiceID 匹配,我只想 return Service Description 的单个值。看到 5 的 ServiceID 有两个 Service Descriptions 了吗?我只想抓住其中一个。我怎样才能修改上面的 select 语句来完成这样的事情?

您可以使用 MAX()MIN()Row_Number()

SELECT distinct
    max(sr.ServiceDescription),
    os.ServiceID
FROM            
    OrderedServices as os           
INNER JOIN
    Orders as o ON o.OrderID = os.OrderID
INNER JOIN
    ServiceRelation as sr ON os.ServiceID = sr.ServiceID
WHERE 
    o.OrderID = 2802882 group by  os.ServiceID;

或者

SELECT distinct
        MIN(sr.ServiceDescription),
        os.ServiceID
    FROM            
        OrderedServices as os           
    INNER JOIN
        Orders as o ON o.OrderID = os.OrderID
    INNER JOIN
        ServiceRelation as sr ON os.ServiceID = sr.ServiceID
    WHERE 
        o.OrderID = 2802882 group by  os.ServiceID;

或者

 ;with cte as
    (
    SELECT distinct
                sr.ServiceDescription,
                os.ServiceID,
               Row_Number() Over(partition by os.ServiceID order by  os.ServiceID)           
 as rn
            FROM            
                OrderedServices as os           
            INNER JOIN
                Orders as o ON o.OrderID = os.OrderID
            INNER JOIN
                ServiceRelation as sr ON os.ServiceID = sr.ServiceID
            WHERE 
                o.OrderID = 2802882
    )
    select * from cte where rn=1