2009-06-30 4 views
0

Also ich habe ein paar Daten. Es gibt Entitäten. Entitäten haben eine beliebige Anzahl von Elementen. Elemente können aus einer definierten Gruppe von Typen bestehen. Eine Entität kann mehr als einen Artikel eines bestimmten Typs haben. Ich kann eine Liste von Gegenständen bekommen, die eine Entität hat. Ich möchte eine Liste von Typen erhalten, für die eine Entität keinen Gegenstand hat.SELECT Elementtypen, die nicht von einer Entität zur Verfügung gestellt werden

Hier ist mein Schema:

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 

Ich möchte Bobs id (1) und erhalten diese Liste abfragen:

4 blue 
5 orange 

und Abfrage Alices id (2) und erhalten:

1 red 
2 yellow 
4 blue 

Es beginnt wahrscheinlich mir im Gesicht. Ich werde weiter daran arbeiten, aber ich wette, du siehst mich so an. Vielen Dank für Ihre Zeit.

Antwort

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') 

oder (manchmal schneller, aber Optimizern sind immer besser die Zeit):

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

für 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 

für Alice tauschen nur e.id <> 1 <> 2

0

e.id Ich denke, das ist das, was Sie suchen:

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

Die "entity_id = 1" steht für Bob, ändern Sie es bei Bedarf.

0

Ich werde überarbeiten diese, um es besser zu machen, aber hier ist eine Arbeitslösung

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 
Verwandte Themen