繁体   English   中英

多列上的相同连接约束

[英]Same Join Constraints on Multiple Columns

我们有一种情况,我可以通过以下简单示例重新创建。 我有以下两个示例表:

CREATE TABLE contact_info
(
  id INT UNSIGNED AUTO_INCREMENT,
  priContactId INT,
  secContactId INT,
  blahBlah VARCHAR(32),

  PRIMARY KEY(id)  
);  

CREATE TABLE name_lookup
(
  id INT UNSIGNED AUTO_INCREMENT,
  contactID INT,
  contactName VARCHAR(32),

  PRIMARY KEY(id)  
);  

我将它们填充如下:

INSERT INTO contact_info(priContactId, secContactId, blahBlah) VALUES(1, 3, "Team A"), (4, 2, "Team B");
INSERT INTO name_lookup(contactID, contactName) VALUES(1, "John Doe"), (2, "Mary Smith"), (3, "Jose Garcia"), (4, "Larry Brown");

显然,表格的内容如下:

+----+--------------+--------------+----------+
| id | priContactId | secContactId | blahBlah |
+----+--------------+--------------+----------+
|  1 |            1 |            3 | Team A   |
|  2 |            4 |            2 | Team B   |
+----+--------------+--------------+----------+

+----+-----------+-------------+
| id | contactID | contactName |
+----+-----------+-------------+
|  1 |         1 | John Doe    |
|  2 |         2 | Mary Smith  |
|  3 |         3 | Jose Garcia |
|  4 |         4 | Larry Brown |
+----+-----------+-------------+

我们想执行一个 JOIN 操作,以便我们得到 output ,如下所示:

+-------------+-------------+--------+
| John Doe    | Jose Garcia | Team A |
+-------------+-------------+--------+
| Larry Brown | Mary Smith  | Team B |
+-------------+-------------+--------+

priContactIdsecContactId列的连接约束是相同的,我很难弄清楚 JOIN 查询应该是什么样子。

仅供参考,我们使用的是 MySQL 版本5.6.49

两个单独的列需要 2 个单独的表副本连接。

SELECT t1.contactName name1, t2.contactName name1, t3.blahBlah team
FROM name_lookup t1
JOIN name_lookup t2
JOIN contact_info t3 ON t1.contactID = t3.priContactId
                    AND t2.contactID = t3.secContactId

这通常会通过两个连接来处理。 您对两个联系人not null约束,所以我建议外连接:

select nl_pri.contactName as PrimaryName, nl_sec.contactName as SecondaryName,
       ci.blahblah
from contact_info ci left join
     name_lookup nl_pri
     on ci.priContactId = nl_pri.contactId left join
     name_lookup nl_sec
     on c.secContactId = nl_sec.contactId;

笔记:

  • left join保留所有联系人,即使是那些没有主要和次要的联系人。
  • 表别名使查询更易于编写和阅读。 表别名应该是有意义的
  • 您应该定义外键关系,因此很明显联系人 ID 是指name_lookup表。

暂无
暂无

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

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