>Come avevo indicato nel post se un utente seleziona sia "Accesso
>al mare" che "Ascensore" deve restituirmi una sola volta l'elemento
>che ha ENTRAMBI i servizi.
Ah, ho capito. Guarda questo esempio:
USE tempdb;
CREATE TABLE dbo.elementi(
id_elemento int IDENTITY NOT NULL,
nome_elemento varchar(10) NULL,
id_città int NOT NULL,
CONSTRAINT PK_Elementi PRIMARY KEY(id_elemento)
);
CREATE TABLE dbo.servizi(
id_servizio int IDENTITY NOT NULL,
nome_servizio varchar(20) NULL,
icona_servizio varchar(5) NULL,
elimina_servizio bit NULL,
CONSTRAINT PK_Servizi PRIMARY KEY(id_servizio)
);
CREATE TABLE dbo.servizi_elementi(
id_elemento int NOT NULL,
id_servizio int NOT NULL,
attiva_servizio_elemento bit NULL,
CONSTRAINT PK_Servizi_Elementi PRIMARY KEY(id_elemento, id_servizio),
CONSTRAINT FK_servizi_elementi_elementi FOREIGN KEY(id_elemento)
REFERENCES dbo.elementi(id_elemento),
CONSTRAINT FK_servizi_elementi_servizi FOREIGN KEY(id_servizio)
REFERENCES dbo.servizi(id_servizio)
);
INSERT dbo.elementi
VALUES('Hotel Uno', 1);
INSERT INTO dbo.servizi(nome_servizio)
VALUES('Accesso al mare'), ('Ascensore');
INSERT INTO servizi_elementi(id_servizio, id_elemento)
VALUES(1, 1), (2, 1);
/* Numero di servizi selezionati */
DECLARE @Count int = 2;
SELECT E.nome_elemento, E.id_città
FROM dbo.elementi AS E
JOIN dbo.servizi_elementi AS SE
ON E.id_elemento = SE.id_elemento
JOIN dbo.servizi AS S
ON SE.id_servizio = S.id_servizio
WHERE S.nome_servizio IN ('Accesso al mare', 'Ascensore')
AND E.id_città = 1
GROUP BY E.nome_elemento, E.id_città
HAVING COUNT(*) = @Count;
/* Output:
nome_elemento id_città
------------- -----------
Hotel Uno 1
(1 row(s) affected)
*/
DROP TABLE dbo.servizi_elementi, dbo.servizi, dbo.elementi;
Come puoi vedere è identico al precedente con l'aggiunta della clausola HAVING che fa in modo di restituire solo gli hotel per i quali esistano tutti i servizi selezionati dall'utente (e specificati nella clausola IN()).
>Grazie mille
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/