2009-06-30 2 views
0

그래서 일부 데이터가 있습니다. 엔티티가 있습니다. 엔티티에는 임의의 수의 항목이 있습니다. 항목은 정의 된 유형 세트 중 하나 일 수 있습니다. 엔티티는 주어진 유형의 항목을 둘 이상 가질 수 있습니다. 엔티티에있는 항목 목록을 가져올 수 있습니다. 내가 원하는 것은 엔터티에 항목이없는 유형의 목록을 가져 오는 것입니다. 여기 엔터티가 제공하지 않는 SELECT 항목 유형

내 스키마입니다 :

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 

내가 밥의 ID (1) 조회하고이 목록 좀하고 싶습니다 :

4 blue 
5 orange 

을 그리고 앨리스의 ID를 조회 (2)와 수 :

1 red 
2 yellow 
4 blue 

얼굴을 아프게 할 수도 있습니다. 나는 계속 노력할 것이지만, 그래서 당신이 그걸 들으면 나를 쳐다볼 것입니다. 시간 내 주셔서 감사합니다. 밥

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 

에 대한

답변

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

또는 (때로는 빠르게,하지만 최적화는 모든 시간 좋아지고 있습니다) :

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

앨리스를 위해 단지 e.id하는 e.id <> (1)를 교환 <> 2

0

나는 이것이 당신이 찾고있는 생각 :

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

"entity_id = 1"은 Bob을 나타내며 필요한 경우 변경합니다.

0

내가 여기이 더 잘 만들기 위해 재 작업,하지만 것은 작업 솔루션

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 
입니다
관련 문제