2017-08-10 16 views
1

に参加私は2つのテーブルがある - ボックスとアイテム:SQL選択行のみ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 

を私はボックスからすべての項目を取得する必要がある項目からMAX(サイズ)に参加しました。私はサブクエリのような数多くの方法が、ある読み取りまたはGROUP BYを(使用してきたものから、

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

:アイテムから該当するサイズがない場合、サイズは0です。

結果は次のようにする必要がありますする必要があります明らかにMSSQLでは許可されていません)。どのRDBMS(あるいは少なくとも)のRDBMSでも最も効果的な方法は何ですか?

答えて

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 
+0

私はhttps://stackoverflow.com/questions/18694094/select-only-rows-by-join-tables-max-valueに同様のソリューションを見ました。しかし、この方法の使用に関するいくつかの警告があります。 – Technical

+0

um ..その警告の正確なポイントを取得できませんでした... – LONG

0

私はこれをMSSQLでテストする方法はありませんが、私の経験上、サブクエリはこのようなことを行う最も効率的な方法です。ここで

select b.id, b.name, 
    (select max(i.size) from items i where i.box = b.id) as size 
from boxes b; 
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