Frage

So habe ich einige Daten einsehen. Es gibt Einrichtungen. Einheiten haben eine beliebige Anzahl von Elementen. Artikel kann man aus einer definierten Menge von Typen sein. Ein Unternehmen kann mehr als ein Element eines bestimmten Typs hat. Ich kann eine Liste der Elemente, die ein Unternehmen hat. Was ich will, ist eine Liste der Arten zu erhalten, die ein Unternehmen nicht für einen Gegenstand hat.

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 abzufragen:

4   blue
5   orange

Und Alices ID abfragen (2) und erhalten:

1   red
2   yellow
4   blue

Es fängt mich wahrscheinlich ins Gesicht. Ich werde halten, daran zu arbeiten, aber ich wette, Sie SO guckt mich an sie zu schlagen. Herzlichen Dank für Ihre Zeit.

War es hilfreich?

Lösung

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

Andere Tipps

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 bis e.id <> 2

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" Bob steht, ändern Sie es als notwendig.

Ich werde überarbeiten diese 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top