繁体   English   中英

SQL在两个不同的列上进行联接

[英]SQL to JOIN on two different columns

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

我们将医生联系方式与患者联系方式联系起来。 CONTACT_CONTACT桌子上有CONTACTID1CONTACTID2CONTACT1_ROLECONTACT2_ROLE

我们使用ClientID在CONTACT表中查询初始CONTACT 然后,我们使用CONTACTID进行表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中列出的Doctor角色进行联系的同一个问题。

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

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')

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

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'

我不清楚您希望/尝试从查询中获取什么信息,因为您仅从单个表的数据中进行选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM