Où n'existe pas avec une à plusieurs relation

J'ai du mal à comprendre comment poser cette question, donc je vais aller directement à l'exemple de code. Disons que j'ai ces tables:

create table Item ( ItemId int identity(1,1), Name nvarchar(256) ) create table ItemSale ( ItemSaleId int identity(1,1), ItemId int, Price decimal, CategoryId tinyint ) 

Ce que je veux récupérer est la list des loggings ItemSale qui ne sont pas dans un CategoryId donné. La complication, au less pour moi, est que si un logging existe dans ItemSale pour un Item donné, je ne veux pas voir d'loggings pour cet Item .

Donc, si j'ai ces données:

 insert into Item(Name) select N'Widget' union all select N'Foo' union all select N'Buzz' insert into ItemSale(ItemId, Price, CategoryId) select 1, 9.95, 1 union all select 1, 19.95, 2 union all select 3, 99.99, 3 

Et le CategoryId je veux filterr est 1, alors je ne veux voir aucun logging pour ItemId 1 ("Widget"). Donc, avec cet exemple de données, je ne verrais que l'logging ItemSale pour Item avec ID 3.

Je sais que ma solution impliquera probablement une sorte de NOT EXISTS OU LEFT JOIN mais je suis aux sockets avec la façon de filterr tous les loggings au lieu de simplement l'logging spécifique qui correspond à mes critères. Qu'est-ce que je rate?

SQLFiddle: http://sqlfiddle.com/#!3/79c58

Je suis peut-être en train de simplifier votre problème, mais je pense que cela fonctionnerait:

 SELECT * FROM ItemSale i WHERE NOT EXISTS ( SELECT 1 FROM ItemSale i2 WHERE i.ItemID = i2.ItemID AND i2.CategoryID = 1 ); 

Exemple sur SQL Fiddle