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