>Come posso fare per ottenere tutte le ricette che contengono
>SOLO gli ingredienti 1 e 3?
Ciao Dino,
La soluzione consiste nel restituire le righe che soddisfano entrambi gli ingredienti considerando però solo quelle che li contengono entrambi (che è più o meno quello che hai scritto tu )
Ma come si fa?
Basta raggruppare le righe per ricetta determinandone il numero, restituendo quelle il cui conteggio è pari a 2 (dato che gli ingredienti specificati nel filtro sono 2).
USE tempdb;
CREATE TABLE dbo.Ricetta(
RicettaID int NOT NULL,
Nome varchar(10) NOT NULL,
CONSTRAINT PK_Ricetta PRIMARY KEY(RicettaID)
);
CREATE TABLE dbo.Ingredienti(
IngredienteID int NOT NULL,
Nome varchar(10) NOT NULL,
CONSTRAINT PK_Ingredienti PRIMARY KEY(IngredienteID)
);
CREATE TABLE dbo.RicetteIngredienti(
RicettaID int NOT NULL,
IngredienteID int NOT NULL,
CONSTRAINT PK_RicetteIngredienti PRIMARY KEY(RicettaID, IngredienteID),
CONSTRAINT FK_RicetteIngredienti_Ricetta FOREIGN KEY(RicettaID)
REFERENCES dbo.Ricetta(RicettaID),
CONSTRAINT FK_RicetteIngredienti_Ingredienti FOREIGN KEY(IngredienteID)
REFERENCES dbo.Ingredienti(IngredienteID)
);
INSERT dbo.Ricetta VALUES
(7, 'Lasagne')
, (8, 'Brasato')
, (9, 'Frittura');
INSERT dbo.Ingredienti VALUES
(1, 'Aglio')
, (2, 'Cipolla')
, (3, 'Pepe')
, (4, 'Olio');
INSERT dbo.RicetteIngredienti VALUES
(7, 1)
, (7, 2)
, (8, 1)
, (8, 3)
, (9, 4)
, (9, 1)
, (9, 3);
SELECT R.RicettaID, R.Nome
FROM dbo.Ricetta AS R
JOIN dbo.RicetteIngredienti AS RI
ON R.RicettaID = RI.RicettaID
WHERE RI.IngredienteID IN(1, 3)
GROUP BY R.RicettaID, R.Nome
HAVING COUNT(*) = 2;
/* Output:
RicettaID Nome
----------- ----------
8 Brasato
9 Frittura
(2 row(s) affected)
*/
DROP TABLE dbo.RicetteIngredienti, dbo.Ingredienti, dbo.Ricetta;
>Grazie a tutti!
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org