【问题标题】:How can I only include one match when using INNER JOIN while doing SELECT statement in SQL Server?在 SQL Server 中执行 SELECT 语句时使用 INNER JOIN 时,如何只包含一个匹配项?
【发布时间】:2015-09-23 18:19:41
【问题描述】:
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;

假设这会返回如下内容:

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

但是,如果两个 ServiceIDs 匹配,我只想为 Service Description 返回一个值。看到ServiceID of 5 有两个Service Descriptions?我只想抓住其中一个。如何修改上面的 select 语句来完成这样的事情?

【问题讨论】:

    标签: sql-server select inner-join


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 如果你做到了,你需要分组。
    • 太好了,我选择了 min。我可以做最大或最小的,这就是我正在寻找的。谢谢!
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 2023-04-03
    • 2010-11-20
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多