在查询中连接表

时间:2012-02-14 18:48:56

标签: sql

我有一组基本上看起来像这样的表

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。我可以用嵌套选择来做到这一点,但我想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:1)

加入AGENCYAGENT,您可以在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