我有两张桌子 - 盒子和物品:
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上工作?
答案 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