我有一组基本上看起来像这样的表
AGENCY
- AGENCY_NAME
- AGENCY_ID
AGENT
- AGENT_NAME
- AGENT_ID
- AGENCY_ID
ITEM
- ITEM_NAME
- ITEM_ID
- AGENT_ID
ITEM映射到AGENT,AGENT映射到AGENCY。
我需要能够为给定的代理商选择所有项目,我提供的输入是AGENT_ID。我知道如何只通过代理获取所有内容,但我无法弄清楚如何编写单个查询,该查询将返回属于给定代理的代理中的代理的所有ITEMS。我可以用嵌套选择来做到这一点,但我想知道是否有更好的方法。
答案 0 :(得分: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'
答案 1 :(得分:0)
我将此解释为您想要的,对于给定的代理(由agent_id指定),您需要属于给定代理所属的代理商的所有代理的所有项目。
所以,这将是:
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')
您无法避免子查询(也不存在真正的问题)。
答案 2 :(得分: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