2012-02-14 6 views
1

У меня есть набор таблиц, которые в основном похож на этотобъединение таблиц в запросе

AGENCY 
- AGENCY_NAME 
- AGENCY_ID 

AGENT 
- AGENT_NAME 
- AGENT_ID 
- AGENCY_ID 

ITEM 
- ITEM_NAME 
- ITEM_ID 
- AGENT_ID 

пункт, сопоставлен АГЕНТА и АГЕНТ сопоставлен с АГЕНТСТВА.

Мне нужно уметь выбирать все предметы для данного агентства, то, что я даю как вход, является AGENT_ID. Я знаю, как получить все только агентом, но я не могу понять, как написать один запрос, который вернет все ITEMS, которые принадлежат агентам агентства агентства. Я могу сделать это с вложенными выборами, но мне было интересно, есть ли лучший способ.

ответ

1

Присоединение к AGENCY через AGENT позволит поставлять AGENCY_ID в пункте WHERE и вернуть все ITEM с для агентов, принадлежащих к этому учреждению:

SELECT 
    ITEM_NAME, 
    ITEM_ID 
FROM 
    ITEM 
    JOIN AGENT ON ITEM.AGENT_ID = AGENT.AGENT_ID 
    JOIN AGENCY ON AGENT.AGENCY_ID = AGENCY.AGENCY_ID 
WHERE AGENCY.AGENCY_ID = 'your_input_id' 

В качестве дополнительного бонуса, вы можете добавить дополнительную информацию о агент здесь, так как AGENT соединяется в ...

SELECT 
    ITEM_NAME, 
    ITEM_ID, 
    AGENT_NAME 
FROM 
    ITEM 
    JOIN AGENT ON ITEM.AGENT_ID = AGENT.AGENT_ID 
    JOIN AGENCY ON AGENT.AGENCY_ID = AGENCY.AGENCY_ID 
WHERE AGENCY.AGENCY_ID = 'your_input_id' 
+0

я на самом деле нужно запросить по agent_id не agency_id. –

+0

@RockyTriton Вам понадобится подзаголовок где-нибудь тогда, либо в предложении WHERE, либо в соединении с производной таблицей. –

+0

ОК, это был мой первоначальный план, но мне было интересно, можно ли его каким-то образом избежать. –

0

Я интерпретирую это, чтобы сказать, что вы хотите, для данного агента (указанный agent_i d), вы хотите, чтобы все элементы для всех агентов, принадлежащих агентству, к которому принадлежит данный агент.

Таким образом, это было бы:

select i.* 
from item i 
join agent a 
    on i.agent_id = a.agent_id 
join agency ag 
    on ag.agency_id = a.agency_id 
where ag.agency_id = 
    (select agency_id from agent a2 
    where a2.agent_id = 'my_agent') 

Вы не можете избежать подзапрос (и не является действительно проблемой, что есть один).

0

Два варианта. Мне нравится вложенная версия, потому что для меня она читается немного понятнее. Оба asssume параметр @AGENTID в качестве вашего «стартового» агента и используйте SELECT DISTINCT для удаления повторяющихся элементов.

-- Nested/subquery: pick out all agents (and their items) 
-- in the same agency as your target agent 
SELECT distint it.ITEM_ID, it.ITEM_NAME 
from AGENT agt 
    inner join ITEM it 
    on it.AGENT_ID = agt.AGENT_ID 
where agt.AGENCY_ID = (select AGENCY_ID 
         from AGENT 
         where agt.AGENT_ID = @AGENT_ID) 

и

-- No nesting: Start with target agent, join to all agents 
-- (including themselves) in the same agency, and on to 
-- all their items 
SELECT distint it.ITEM_ID, it.ITEM_NAME 
from AGENT agt 
    inner join AGENT agt2 
    on agt2.AGENCY_ID = agt.AGENCY_ID 
    inner join ITEM it 
    on it.AGENT_ID = agt2.AGENT_ID 
where agt.AGENT_ID = @AGENT_ID 
Смежные вопросы