SELECT Elementtypen nicht von einer Einrichtung erbracht
-
21-08-2019 - |
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.
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