2012-09-11 35 views
0

在用于建设项目的CRM中,客户端,架构师和其他承包商都以ACCOUNT的形式存在。表PROJ_AC_LINK将ACCOUNT链接到PROJECT,并且字段PROJ_AC_LINK.ROLE_TYPE_ID指定该链接表示的内容(例如Joe Simms在角色'architect'下链接到项目101)。确定左加入中是否有多个记录

CRM数据库和用户界面允许用户将多个帐户链接到同一角色下的项目。在某些情况下,这没什么问题(项目有2位建筑师),但在某些情况下不是(应该只有一位客户为我们发票)。我无法更改CRM。

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

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人员他们是否通过空白客户端地址。但是,我需要迎合有多个客户链接到一个项目的可能性。

有没有一种方法可以使CLIENT_ADDRESS返回NULL(或自定义文本),如果PROJ_AC_LINK中有多个记录为该角色的该项目。

任何想法?

回答

0

您可以按语句执行一个组,然后根据您返回的记录的计数执行一个case语句。

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 

这只是从帐户表返回单地址。

+0

我看到了这个想法,但实际上它与原始查询的做法相同:如果有2个帐户(如客户端),则返回2行。我认为子选择应该在链接表上,我不想尝试改变它... – andyhasit