在 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
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