您的位置:首页 > 数据库

SQL--当一张表的两个外键指向同一主键

2017-11-26 18:54 2601 查看
最近遇到了这样一个问题,当一张表中有两个外键同时执行了另外一种表的主键,如何建立一张视图,让这两个外键都找到相应的信息。

来实例吧:

第一张表,归还记录:



第二张表,用户表:



问题就是,归还记录表里有两个字段,applicantUserID, operUserID,分别是申请人ID和操作人ID,他们作为外键同时指向了用户表的userID,现在想通过这两个外键获取他们各个ID对应的姓名,即userName.

分析:

当我们表里只有一个外键与另外一张表关联的时候是很容易找到相应的userName的,但是现在是两个外键,我们不能将这两个外键同时与另一个主键做关联,这在数据库里是不合规则的,所以我们需要分别关联两次。

解决办法:

SELECT
t_a.userName,
t.userName
FROM
(SELECT * FROM T_User) AS t_a
RIGHT JOIN T_ReturnLog r ON t_a.userID = r.applicantUserID
LEFT JOIN T_User t ON t.userID = r.operUserID;


效果展示:



解析:

因为我们需要将T_ReturnLog与T_User关联两次,但是数据库不允许对同一张表同时关联两次,所以现查询表的所有内容 As t_a 这个时候 t_a作为一张新表和T_User的内容是一样的。

第一次做右连接,将t_a与T_ReturnLog右连接,这时可以通过t_a.userName查到applicantUserID对应的用户姓名。

第二次做左连接,将T_ReturnLog与T_User左连接,这时可以通过t.userName查到operUserID对应的用户姓名。

所以select的时候是t_a.userName和t.userName.

(ps:T_User新表命名为t_a表; T_User重命名为了t表, T_ReturnLog重命名为了 r表)

关于连接:

为什么第一次用右连接,第二次用左连接?

第一次将t_a表与r表关联,这个时候做右连接,条件是t_a.userID=r.applicantUserID,即将要右边的r表作为主表,r表的数据是不能少的,从t_a中拿到相应的申请人姓名。

第二次将r表与t表关联,做左链接,即r表依然是主表,条件是r.operID=t.userID拿到t表中相应的操作人姓名。

上篇博客总结关于SQL的四种连接,如有需要,请跳转:SQL左右内外连接

小结:

因为要根据r表中的两个ID列找到t表中相应的负责人姓名,所以r表任何时候都是要作为主表与另外一张表作连接。而且因为不能同时连接同一张表,所以要查询t 表内容作为另外一张新表嵌套进去。 ps:数据库的查询需要好好分析理清楚思路。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: