GROUP BY的同类容器

时间:2013-06-17 21:00:04

标签: sql sql-server group-by

假设我有两张桌子。一个用于容器的水果,一个用于水果。像这样:

CREATE TABLE Containers
(
ContainerID int,
ContainedFruit int
)

CREATE TABLE Fruit
(
FruitID int,
Name VARCHAR(16)
)

INSERT INTO Fruit VALUES ( 1, 'Apple' )
INSERT INTO Fruit VALUES ( 2, 'Banana' )
INSERT INTO Fruit VALUES ( 3, 'Cherry' )
INSERT INTO FRUIT VALUES ( 4, 'Date' )

INSERT INTO Containers VALUES ( 101, 1 )
INSERT INTO Containers VALUES ( 101, 1 )
INSERT INTO Containers VALUES ( 102, 1 )
INSERT INTO Containers VALUES ( 102, 2 )
INSERT INTO Containers VALUES ( 102, 3 )
INSERT INTO Containers VALUES ( 103, 3 )
INSERT INTO Containers VALUES ( 103, 4 )
INSERT INTO Containers VALUES ( 104, 3 )

我想找到所有只有一种水果类型的容器ID。允许它们中有两个苹果(如容器101的情况),或者它们中只有一个(容器104)。但容器102和103中有两种不同的水果,所以我不希望它们被包括在内。

我如何做一个能够抓住容器101和104的SELECT,以及将来只有一种水果的容器?

- 编辑 -

好的,这实际上只是我问题的一半:

假设我有第三张桌子。这唯一标识容器。无论如何,这种结构都隐含着:

INSERT INTO FRUIT VALUES ( 0, 'Mixed' )

CREATE TABLE Each_Container
(
Container ID int PRIMARY KEY,
FruitType int
)

INSERT INTO Each_Container VALUES ( 101, 0 )
INSERT INTO Each_Container VALUES ( 102, 0 )
INSERT INTO Each_Container VALUES ( 103, 0 )
INSERT INTO Each_Container VALUES ( 104, 3 )

现在,此时前三个容器标记为MIXED。虽然第四只是樱桃的容器。但这是我的问题:

如何更新所有ERRONEOUSLY标记的容器,如101?那些只标记为MIXED的那些,因为它们中有多种水果,即使它们是同一类型的水果? 102和103应该混合,但101不应该。

3 个答案:

答案 0 :(得分:1)

这应该这样做:

SELECT ContainerID
FROM Cointainers
GROUP BY ContainerID
HAVING COUNT(DISTINCT ContainedFruit) = 1

答案 1 :(得分:1)

您可以使用聚合和having子句执行此操作:

select ContainerId
from Containers
group by ContainerId
having count(distinct ContainedFruit) = 1

稍微更有效的形式是:

select ContainerId
from Containers
group by ContainerId
having min(ContainedFruit) = max(ContainedFruit)

此外,您的数据结构缺少表格。名为Containers的表格应该是ContainerFruit,因为它会加入"包含和水果。应该有一个名为Containers的单独表,每个容器有一行。

答案 2 :(得分:0)

select * 
from (select ContainerID, count(distinct ContainedFruit) num_types
      from Containers
      group by ContainerID) t
where num_types = 1