>Salve a tutti. Ho un problemino di sql che non riesco a risolvere:
>ho 2 tabelle con relazione uno a molti. Ora, in una query sola
>ho bisogno di selezionare tutti i prodotti dalla tabella A che
>abbiano tutte le caratteristiche indicate e presenti nella tabella
>B.
>
>La struttura delle tabelle è:
>
>tabella A:
>id | campo1 | campo2 ecc
>
>tabella B
>idfilter | id (= id in tabella A)
>
>La struttura prevede che per ogni record in tabella A ci possano
>essere più record in tabella B.
>
>La query più ovvia mi sembrava:
>
>SELECT DISTINCT B.* FROM a
>LEFT JOIN B ON a.id = b.id
>WHERE idfilter IN (2,9)
>
>Il che però mi ritorna tutti i record che hanno per idfilter
>2 OPPURE 9. Invece a me servono solo i record che abbiano 2 E
>9.
La query che hai postato recupera informazioni esclusivamente dalla tabella B, quindi non capisco per quale motivo interroghi anche la tabella A.
Il problema può essere risolto con una tabella derivata che restituisca gli id che soddisfano la condizione di ricerca in JOIN con la tabella B per recuperare tutte le colonne.
L'esempio che sto per proporti è per SQL Server 2005 o successivo che fa uso di una Common Table Expression (CTE):
USE tempdb;
CREATE TABLE dbo.A(
id int NOT NULL PRIMARY KEY
);
CREATE TABLE dbo.B(
idfilter int NOT NULL,
id int NOT NULL,
CONSTRAINT PK_B PRIMARY KEY (idfilter, id),
CONSTRAINT FK_B_A FOREIGN KEY (id)
REFERENCES dbo.A(id)
);
INSERT dbo.A
VALUES (1), (2), (3), (4);
INSERT dbo.B
VALUES (1, 1), (2, 1), (3, 1)
, (1, 2), (2, 2), (9, 2)
, (1, 3), (3, 3), (9, 3)
, (2, 4), (8, 4), (9, 4);
WITH CTE_GetKey AS
(
SELECT id
FROM dbo.B
WHERE idfilter IN (2, 9)
GROUP BY id
HAVING COUNT(*) >= 2
)
SELECT B.*
FROM dbo.B
JOIN CTE_GetKey AS C
ON B.id = C.id;
/* Output:
idfilter id
----------- -----------
9 2
2 2
1 2
8 4
9 4
2 4
(6 row(s) affected)
*/
DROP TABLE dbo.B, dbo.A;
>Grazie dell'aiuto
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/