我有2张桌子。一个是Agent
,另一个是Agent_Contact
。 Agent_Contact
表用于维护Agent
的联系信息。
从Agent
到Agent_Contact
的关系为One-To-Many
,这意味着Agent
可以有多个Agent_Contacts
Agent_Contact
持有Foreign Key
的{{1}}。
Agent
可能Agents
也没有Agent_Contact
。
现在,请看下面的代码。
SELECT Agent.*,
Agent_Contact.*
FROM Agent
LEFT JOIN Agent_Contact ON Agent.idAgent = Agent_Contact.idAgent
现在,这会返回所有Agents
及其Agent_Contact
s(如果有的话)。但是假设一个Agent
获得了15 Agent_Contact
s,那么它将返回15行。
这不是我想要的。每Agent_Contact
Agent
就足够了。但是如何修改上面的sql查询来实现这个任务呢?
答案 0 :(得分:0)
由于没有必须返回联系的规则,因此添加group by子句就足够了。
SELECT Agent.*,
Agent_Contact.*
FROM Agent
LEFT JOIN Agent_Contact ON Agent.idAgent = Agent_Contact.idAgent
GROUP Agent.idAgent
答案 1 :(得分:0)
如果您只希望每agent_contact
次返回1 agent
,那么问题是"您想要返回哪个agent_contact?"
这就像选择一个满20名学生的教室并说“#34;请返回1名学生。”#34;那么......你想要哪个学生?
在选择Agent_Contact时,您可以按字母顺序选择,或者选择名称最长的 ,这样可以将agent_contacts的数量减少到1。
此查询选择具有最大名称的agent_contact。你可以使用你想要的任何agent_contact列,它只需要放在一个只返回一种的聚合函数中。
SELECT t.Id, ac.* FROM
(SELECT Agent.Id, Max(AgentContact.Name)
FROM Agent
LEFT JOIN Agent_Contact ON Agent.idAgent = Agent_Contact.idAgent
GROUP BY Agent.Id) as t
INNER JOIN Agent_Contact as ac ON t.Name = ac.Name