SQL选择行并仅在MAX()值上连接

时间:2017-08-10 18:05:56

标签: sql select join max

我有两张桌子 - 盒子和物品:

Boxes
Id|Name
 1|Box1
 2|Box2
 3|Box3

Items
Id|Size|Box
 1|2   |1
 2|3   |1
 3|2   |2
 4|5   |2

我需要从项目中获取Box中所有与MAX(大小)连接的项目。如果项目没有相应的大小,则大小应为0。

结果应该是这样的:

Result
Id|Name|Size
 1|Box1|3
 2|Box2|5
 3|Box3|0

根据我的阅读,有许多方法,例如子查询或使用GROUP BY(显然,在MSSQL中不允许)。什么是最有效的方法,可以在任何(或至少)大多数RDBMS上工作?

3 个答案:

答案 0 :(得分:2)

SELECT A.ID,A.Name,COALESCE(MAX(Size),0)
FROM Boxes AS A
LEFT JOIN ITEMS AS B
ON B.BOX = A.Id
GROUP BY A.ID,A.Name

答案 1 :(得分:0)

我没有办法在MSSQL上对此进行测试,但根据我的经验,子查询是执行此类操作的最有效方法。

select b.id, b.name, 
  (select max(i.size) from items i where i.box = b.id) as size 
from boxes b;

答案 2 :(得分:0)

以下是该问题的几种解决方案。 @LONG的答案是最好的:

declare @a table(
 ID INT,
 [Name] VARCHAR(20)
)
declare @b table(
 ID INT,
 Size INT,
 Box INT
)

INSERT @a VALUES(1,'Box 1'),(2,'Box 2'),(3, 'Box 3')
INSERT @b VALUES(1,2,1),(2,3,1),(3,2,2),(4,5,2)

select * from @a
select * from @b

select 
A.ID,
A.[Name],
ISNULL(BB.MaxSize, 0)
from @a A
LEFT JOIN (SELECT Max(Size) AS MaxSize, Box FROM @b B 
GROUP BY B.Box) BB ON A.ID = BB.Box


SELECT A.ID,A.Name,COALESCE(MAX(Size),0)
FROM @a AS A
LEFT JOIN @b AS B
ON B.Box = A.Id
GROUP BY A.ID,A.Name