0

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

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 里面有两种不同的水果,所以我不希望它们被包括在内。

我将如何做一个 SELECT 来抓取容器 101 和 104,以及将来只有一种水果的任何其他容器?

- 编辑 -

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

假设我有第三张桌子。这唯一地标识了容器。无论如何,它有点暗示在这个结构中:

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。而第四个只是樱桃的容器。但这是我的问题:

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

4

3 回答 3

1

这应该这样做:

SELECT ContainerID
FROM Cointainers
GROUP BY ContainerID
HAVING COUNT(DISTINCT ContainedFruit) = 1
于 2013-06-17T21:04:56.883 回答
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,每个容器有一行。

于 2013-06-17T21:05:34.410 回答
0
select * 
from (select ContainerID, count(distinct ContainedFruit) num_types
      from Containers
      group by ContainerID) t
where num_types = 1
于 2013-06-17T21:10:09.057 回答