0

2 つのテーブルがあるとします。1 つは果物の容器用、もう 1 つは果物用です。このような:

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 )

フルーツの TYPE が 1 つしかないすべてのコンテナー ID を検索したいと考えています。リンゴを 2 つ入れることも (コンテナ 101 の場合)、1 つだけ入れることもできます (コンテナ 104)。しかし、コンテナー 102 と 103 には 2 種類の果物が入っているので、それらを含めたくありません。

コンテナー 101 と 104、および将来的に 1 種類の果物しかない他のコンテナーを取得する SELECT を実行するにはどうすればよいでしょうか?

- 編集 -

OK、それは実際には私の質問の半分です。

3 番目のテーブルがあるとします。これにより、コンテナが一意に識別されます。とにかく、この構造ではちょっと暗示されています:

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 )

この時点で、最初の 3 つのコンテナーが MIXED としてマークされます。4番目はチェリーのコンテナです。しかし、ここに私の質問があります:

101 のような誤ってマークされたすべてのコンテナーを更新するにはどうすればよいですか? 同じ種類の果物なのに、複数の果物が入っているため、MIXED とのみマークされているものはありますか? 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)

また、データ構造にテーブルがありません。呼び出されるテーブルは、contains と fruit を「結合」するため、Containers実際にはそうである必要があります。コンテナーごとに 1 つの行を持つContainerFruit、 と呼ばれる別のテーブルが必要です。Containers

于 2013-06-17T21:05:34.410 に答える