Comment récupérer des lignes uniques où plusieurs enfants qui le referencent existent pour différents types?

SELECT * FROM Fruit INNER JOIN Apple ON Fruit.Id = Apple.FruitId WHERE Apple.Type = 1 AND Apple.Type = 3 

Je dois get des rangées uniques de fruits qui ont les deux pommes de type 1 et 3. Apple.Type est considéré comme unique, mais je ne pense pas que cela soit important.

Avec ces rangées, cela devrait returnner deux rangées avec les fruits n ° 50 et n ° 52. La partie la plus importante est le Fruit.Id, je n'ai pas besoin de returnner les Types, mais juste besoin de m'assurer que chaque Fruit returnné a au less un Apple.Type = 1 et un Apple.Type = 3.

 Apple { Id = 1, FruitId = 50, Type = 0 } Apple { Id = 2, FruitId = 50, Type = 1 } Apple { Id = 3, FruitId = 50, Type = 3 } Apple { Id = 4, FruitId = 51, Type = 1 } Apple { Id = 5, FruitId = 51, Type = 2 } Apple { Id = 6, FruitId = 52, Type = 3 } Apple { Id = 7, FruitId = 52, Type = 1 } Apple { Id = 8, FruitId = 52, Type = 2 } Fruit { Id = 50 } Fruit { Id = 51 } Fruit { Id = 52 } 

Je ne suis pas sûr de savoir comment utiliser DISTINCT et / ou GROUP BY afin de former cette requête.

Groupez votre table de pommes par identifiant de fruits et choisissez les résultats qui ont les deux types souhaités. Utilisez ceci pour get vos fruits.

 SELECT * FROM Fruit WHERE id IN ( SELECT FruitId FROM Apple WHERE Type IN (1,3) GROUP BY FruitId HAVING COUNT(DISTINCT Type) = 2 ); 

Cela returnnerait les fruits avec ID 50 et 52.

 SELECT * FROM Fruit WHERE EXISTS ( SELECT 1 FROM Apple WHERE Type = 1 AND Apple.FruitId = Fruit.Id ) AND EXISTS ( SELECT 1 FROM Apple WHERE Type = 3 AND Apple.FruitId = Fruit.Id ) 

Pas la façon la plus efficace, mais la transposition de ces colonnes de sorte que vous avez plusieurs types par fruitid devrait le faire.

 create table type_1 as select FruitId, Type as Type1 from Apple where Type = 1; create table type_3 as select FruitId, Type as Type3 from Apple where Type = 3; create table Fruits as select distinct FruitId from Apple; create table Fruit_Agg as select a.FruitId, b.Type1, c.Type3 from Fruits a left join type_1 b on a.FruitId = b.FruitId left join type_3 c on a.FruitId = c.FruitId; create table Types_1and_3 as select FruitId from Fruit_Agg where Type1 = 1 and Type3 = 3;