0

だから私はいくつかのデータを持っています。エンティティがあります。エンティティには任意の数のアイテムがあります。アイテムは、定義されたタイプのセットの 1 つにすることができます。エンティティは、特定のタイプのアイテムを複数持つことができます。エンティティが持っているアイテムのリストを取得できます。私が欲しいのは、エンティティにアイテムがないタイプのリストを取得することです。

ここに私のスキーマがあります:

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

Bob の ID (1) をクエリして、次のリストを取得したいと思います。

4   blue
5   orange

Alice の ID (2) を照会して取得します。

1   red
2   yellow
4   blue

それはおそらく私を直面させ始めています。私はそれに取り組み続けるつもりですが、あなたはそうのぞき見が私を打ち負かすに違いない. どうぞよろしくお願いいたします。

4

4 に答える 4

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
于 2009-06-30T21:49:58.300 に答える
0

ボブのために

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

アリスの場合、e.id <> 1 を e.id <> 2 に交換するだけです

于 2009-06-30T21:44:51.523 に答える
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」はボブを表し、必要に応じて変更します。

于 2009-06-30T21:47:29.117 に答える
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
于 2009-06-30T21:55:07.447 に答える