确定左连接是否有多个记录

时间:2012-09-11 13:09:03

标签: sql left-join

在建筑项目的CRM中,客户,建筑师和其他承包商都以帐户形式存在。表PROJ_AC_LINK将ACCOUNT链接到PROJECT,PROJ_AC_LINK.ROLE_TYPE_ID字段指定该链接代表的内容(例如,Joe Simms在“架构师”角色下链接到项目101)。

CRM数据库和用户界面允许用户将多个帐户链接到同一角色下的项目。在某些情况下这很好(项目有2个架构师),但在某些情况下它不是(我们应该只为项目开具一个'客户')。我不能改变CRM。

来自单独系统的查询试图获取SITE_ADDRESS和CLIENT_ADDRESS,并假设只有一个客户端链接到每个项目。它会像这样查询(205是角色'client'的代码):

SELECT 
PROJECT.ADDRESS AS SITE_ADDRESS, 
ACCOUNT.ADDRESS AS CLIENT_ADDRESS
FROM PROJECT
LEFT JOIN PROJ_AC_LINK ON 
    (PROJ_AC_LINK.PROJECT_ID = PROJECT.PROJECT_ID 
    AND 
    PROJ_AC_LINK.ROLE_TYPE_ID = '205')
LEFT JOIN ACCOUNT ON PROJ_AC_LINK.ACCT_ID = ACCOUNT.ACCT_ID

如果没有链接到项目的客户端,此查询仍会返回SITE_ADDRESS,但会为CLIENT_ADDRESS返回NULL,这正是我想要的。

使用该系统的人知道告诉CRM人员他们是否通过空白客户地址。但是,我需要满足将多个客户端链接到项目的可能性。

如果PROJ_AC_LINK中有多个针对该角色的项目的记录,我可以使CLIENT_ADDRESS返回NULL(或自定义文本)。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以根据您返回的记录数执行group by语句,然后执行case语句。

答案 1 :(得分:0)

这是一种方式:

SELECT p.ADDRESS AS SITE_ADDRESS, 
       a.ADDRESS AS CLIENT_ADDRESS
FROM PROJECT p LEFT JOIN
     (select a.PROJECT_ID, a.ADDRESS
      from ACCOUNT a join
           Proj_AC_Link pa
           on pa.Acct_id = a.Acct_Id
      where pa.ROLE_TYPE_ID = '205'
      group by ac.Project_id
      having count(*) = 1
     ) addr
     ON P.PROJECT_id = addr.project_id

这只返回帐户表中的单个地址。