假设我有两张桌子。一个用于容器的水果,一个用于水果。像这样:
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不应该。
答案 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