SQL在两个不同的列上加入

时间:2015-08-31 19:10:45

标签: sql sql-server

我们的CRM软件具有关系功能,可让您定义两个联系人之间的关系。联系人存储在CONTACT表中,关系存储在CONTACT_CONTACT

我们将医生联系人与患者联系人联系起来。在CONTACT_CONTACT表格中有CONTACTID1CONTACTID2CONTACT1_ROLECONTACT2_ROLE

我们使用ClientID在CONTACT表中查询初始CONTACT。然后我们使用CONTACTID进行表连接。这里的问题是我们的CONTACTID可能位于CONTACT_CONTACT.CONTACTID1CONTACT_CONTACT.CONTACTID2列。

SELECT c2.CONTACT,
   c2.ClientID,
   c2.CONTACTID
FROM CONTACT as c
INNER JOIN CONTACT_CONTACT as cc on c.CONTACTID = cc.CONTACTID2
INNER JOIN CONTACT as c2 on cc.CONTACTID1 = c2.CONTACTID
WHERE c.ClientID = 121695 AND (cc.CONTACT1_ROLE = 'Doctor' OR cc.CONTACT2_ROLE = 'Doctor')

CONTACT中列出的博士角色联系回到CONTACT_CONTACT表格时遇到同样的问题。

如果联系人或医生可以在CONTACT_CONTACT.CONTACTID1CONTACTID2,那么在没有更改数据库表的可能性的情况下,最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

COALESCE应该有效。但是,如果两个字段都有值,则连接将在您首先在括号中列出的字段上执行。

SELECT c.CONTACT,
   c.ClientID,
   c.CONTACTID
FROM CONTACT as c
INNER JOIN CONTACT_CONTACT as cc on c.CONTACTID = COALESCE(cc.CONTACTID1,cc.CONTACTID2)
WHERE c.ClientID = 121695 AND (cc.CONTACT1_ROLE = 'Doctor' OR cc.CONTACT2_ROLE = 'Doctor')

答案 1 :(得分:0)

你不能做两次查询吗?还有其他方法可以确定,但这应该得到我认为的信息:

SELECT c.CONTACT,
   c.ClientID,
   c.CONTACTID
FROM CONTACT as c
INNER JOIN CONTACT_CONTACT as cc on c.CONTACTID = cc.CONTACTID1
INNER JOIN CONTACT as c2 on cc.CONTACTID2 = c2.CONTACTID
WHERE c.ClientID = 121695 
    AND cc.CONTACT1_ROLE = 'Doctor'
union
SELECT c2.CONTACT,
   c2.ClientID,
   c2.CONTACTID
FROM CONTACT as c
INNER JOIN CONTACT_CONTACT as cc on c.CONTACTID = cc.CONTACTID2
INNER JOIN CONTACT as c2 on cc.CONTACTID1 = c2.CONTACTID
WHERE c.ClientID = 121695 
    AND cc.CONTACT2_ROLE = 'Doctor'

我不清楚您希望/尝试从查询中获取哪些信息,因为您只从一张表中选择了数据。