Homogene Behälter mit GROUP BY

Angenommen, ich habe zwei Tische. Eine für Behälter von Früchten und eine für die Frucht. So was:

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 ) 

Ich möchte alle Container-IDs finden, die nur einen TYP von Obst in ihnen haben. Sie dürfen zwei Äpfel in ihnen haben (wie im Fall von Container 101) oder nur 1 Stück in ihnen (Container 104). Aber die Container 102 und 103 haben zwei verschiedene Arten von Früchten in ihnen, so dass ich nicht wollen, dass sie aufgenommen werden.

Wie würde ich eine WAHL machen, die die Container 101 und 104 und alle anderen Container in der Zukunft packen würde, die nur eine Art von Früchten in ihnen haben?

–BEARBEITEN–

OK, also das ist eigentlich nur halb meine Frage:

Angenommen, ich habe einen dritten Tisch. Das identifiziert den Container eindeutig. Es ist irgendwie impliziert in dieser Struktur sowieso:

 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 ) 

Nun sind zu diesem timepunkt die ersten drei Container als MIXED markiert. Während der vierte ist nur ein Container für Kirschen. Aber hier ist meine Frage:

Wie komme ich alle ERRONEOUSLISTE markierten Container wie 101? Die, die nur markiert sind MIXED, weil sie mehrere Früchte in ihnen haben, obwohl sie die gleiche Art von Obst sind? 102 und 103 sollte gemischt werden, aber 101 sollte nicht.

Sie können dies mit einer Aggregation und having Klausel:

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

Eine etwas effizientere Form davon ist:

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

Auch Ihre datastruktur fehlt eine Tabelle. Der Tisch namens Containers sollte wirklich ContainerFruit weil es "verbindet" die enthält und Obst. Es sollte eine separate Tabelle namens Containers , die eine Zeile pro Container hat.

Das sollte es tun:

 SELECT ContainerID FROM Cointainers GROUP BY ContainerID HAVING COUNT(DISTINCT ContainedFruit) = 1 
 select * from (select ContainerID, count(distinct ContainedFruit) num_types from Containers group by ContainerID) t where num_types = 1