2009-06-30 7 views
0

J'ai donc des données. Il y a des entités. Les entités ont un nombre arbitraire d'éléments. Les éléments peuvent être l'un d'un ensemble défini de types. Une entité peut avoir plus d'un élément d'un type donné. Je peux obtenir une liste d'éléments qu'une entité a. Ce que je veux, c'est obtenir une liste de types pour lesquels une entité n'a pas d'objet.SELECT types d'éléments non fournis par une entité

Voici mon schéma:

entities 
id name 
1 Bob 
2 Alice 

item_types 
id  name 
1  red 
2  yellow 
3  green 
4  blue 
5  orange 

items 
entity_id item_type_id name 
1   1   apple 
1   2   banana 
1   3   lime 
1   3   tree 
2   3   money 
2   5   traffic cone 

Je voudrais interroger l'identifiant de Bob (1) et d'obtenir cette liste:

4 blue 
5 orange 

Et requête id d'Alice (2) et obtenez:

1 red 
2 yellow 
4 blue 

Ça me commence probablement dans le visage. Je vais continuer à travailler dessus mais je parie que les peeps m'ont battu dessus. Merci beaucoup pour votre temps.

Répondre

3
select id, name 
from item_types 
where id not in 
    (select i.item_type_id 
    from items i 
    inner join entities e 
     on e.id = t.entity_id 
    where e.Name = 'Bob') 

ou (parfois plus rapide, mais optimiseurs vont mieux tout le temps):

select disctinct t.id, t.name 
from item_types t 
left outer join items i 
    on i.item_type_id = t.id 
left outer join entities e 
    on e.id = i.entity_id 
    and e.Name = 'Bob' 
where e.id is null 
0

pour Bob

SELECT 
    t.id, t.name 
FROM 
    items i 
INNER JOIN 
    entities e ON e.id = i.entity_id 
INNER JOIN 
    item_types t ON t.id = i.item_type_id 
WHERE 
    e.id <> 1 

pour Alice juste permuter e.id <> 1 à e.id <> 2

0

Je pense que c'est ce que vous cherchez:

SELECT id, name 
FROM item_types 
WHERE id NOT IN 
(
    SELECT DISTINCT item_type_id 
    FROM items 
    WHERE entity_id = 1 
) 

"entity_id = 1" représente Bob, modifiez-le si nécessaire.

0

je vais retravailler cela pour faire mieux, mais voici une solution de travail

set nocount on 
go 
drop table #entities 
drop table #itemtype 
drop table #items 
create table #Entities 
(
EntityId int, 
EntityName varchar (250) 
) 
create table #ItemType 
(
ItemTypeId int, 
ItemTypeName varchar (250) 
) 

create table #Items 
(
EntityId int, 
ItemTypeId int, 
ItemName varchar (250) 
) 
go 
insert into #entities values (1, 'Bob') 
insert into #entities values (2, 'Alice') 
go 
insert into #ItemType values (1, 'red') 
insert into #ItemType values (2, 'yellow') 
insert into #ItemType values (3, 'green') 
insert into #ItemType values (4, 'blue') 
insert into #ItemType values (5, 'orange') 
go 
insert into #Items values (1, 1, 'apple') 
insert into #Items values (1, 2, 'banana') 
insert into #Items values (1, 3, 'lime') 
insert into #Items values (1, 3, 'tree') 
insert into #Items values (2, 3, 'money') 
insert into #Items values (2, 5, 'traffic cone') 
go 


;WITH ENTITY AS (
SELECT #Entities.EntityId, EntityName, ItemTypeId, ItemName 
FROM #Entities, #Items 
WHERE #Entities.EntityId = #Items.EntityId 
AND #Entities.EntityName = 'Bob' 
) 
SELECT #ItemType.* FROM ENTITY 
RIGHT JOIN #ItemType ON ENTITY.ItemTypeId = #ItemType.ItemTypeId 
WHERE EntityId is NULL 


;WITH ENTITY AS (
SELECT #Entities.EntityId, EntityName, ItemTypeId, ItemName 
FROM #Entities, #Items 
WHERE #Entities.EntityId = #Items.EntityId 
AND #Entities.EntityName = 'Alice' 
) 
SELECT #ItemType.* FROM ENTITY 
RIGHT JOIN #ItemType ON ENTITY.ItemTypeId = #ItemType.ItemTypeId 
WHERE EntityId is NULL 
Questions connexes