2009-07-08 2 views
0

Извините за бесполезный заголовок, но, надеюсь, я могу это объяснить достаточно хорошо.Запись запроса для получения всех записей в группе на основе элемента в группе

Допустим, у меня есть три таблицы,

Item 
    ItemKey 
    ItemName 

Group 
    GroupKey 

GroupItem 
    GroupKey 
    ItemKey 

Учитывая ItemKey, как бы я получить все записи из таблицы элементов, которые принадлежат к группе, содержащей ключ элемента?

Так что, если у меня есть

Item 
    1 ItemA 
    2 ItemB 
    3 ItemC 

Group 
    1 
    2 
    3 

GroupItem 
    1  1 
    1  2 
    2  1 
    2  2 
    3  2 
    3  3 

Передача в 1 возвратит Itema и ItemB, но не ItemC, так как нет ни одной группы с обеих Itema и ItemC в нем.

+0

И если вы прошли через 2, вы получите ItemA, ItemB и ItemC, потому что они все в группах с ItemB? Правильно ли я понимаю? –

+0

Это правильно. – Brandon

ответ

3
select distinct ItemName 
from Item I 
inner join GroupItem GI 
    on I.ItemKey = GI.ItemKey 
where GI.GroupKey in 
    (select GroupKey 
    from GroupItem 
    where ItemKey = @Param) 
-- @Param is the input parameter. Change for you 
-- DBMS 

или:

select distinct ItemName 
from GroupItem GI_MemberOf 
inner join GroupItem GI_Map 
    ON GI_Map.GroupKey = GI_MemberOf.GroupKey 
inner join Item I 
    on I.ItemKey = GI_Map.ItemKey 
where GI_MemberOf.ItemKey = @Param 
-- @Param is the input parameter. Change for you 
-- DBMS 
+0

Отлично работает, спасибо. Есть ли преимущество в производительности для выбора одного над другим? – Brandon

+1

1) При сравнении производительности альтернативных запросов просматривайте план выполнения своих реальных данных. 2) В прошлом соединения обычно происходили быстрее, чем подзапросы, но оптимизаторы запросов получили достаточно хорошие результаты, часто выбирается один и тот же план выполнения. Тогда это сводится к читаемости. –

1

Вы можете использовать подзапрос.

SELECT DISTINCT i.ItemName 
FROM GroupItem gi JOIN 
    Item i ON gi.ItemKey = i.ItemKey 
WHERE gi.GroupKey IN (
    SELECT DISTINCT GroupKey FROM GroupItem WHERE ItemKey = @Param 
) 
+0

+1, Спасибо за помощь. – Brandon

Смежные вопросы