SQL--当一张表的两个外键指向同一主键
2017-11-26 18:54
2601 查看
最近遇到了这样一个问题,当一张表中有两个外键同时执行了另外一种表的主键,如何建立一张视图,让这两个外键都找到相应的信息。
问题就是,归还记录表里有两个字段,applicantUserID, operUserID,分别是申请人ID和操作人ID,他们作为外键同时指向了用户表的userID,现在想通过这两个外键获取他们各个ID对应的姓名,即userName.
第一次做右连接,将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左右内外连接
来实例吧:
第一张表,归还记录:
第二张表,用户表:
问题就是,归还记录表里有两个字段,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:数据库的查询需要好好分析理清楚思路。相关文章推荐
- sql一张表中两个字段指向同一个外键
- sql一张表中两个字段指向同一个外键
- SQL中为了加强分类表的记录有效性,把主键和外键设计在了同一张表内
- 将两个表中的主键不同数据查找出来并添加到一张新表中的sql示例
- 一个表有两个外键指向另一个表的主键:如何区分显示
- sql查询一张表中两个字段重复的数据并得到其主键
- sql语句:同一张表两个相同外键查询
- SQL中主键与外键的定义和区别
- MyBatis中如何实现两个外键指向同一个类
- SQL的主键和外键约束(转)
- 关于Oracle与SqlServer中获取所有字段、主键、外键的sql语句
- 两个结构完全相同的表a和b,主键为index,使用SQL语句,把a表中存在但在b表中不存在的数据插入的b表中
- SQL的主键和外键
- SQL的主键和外键约束详解及用途
- sql-主键、外键、索引
- SQL的主键和外键的作用
- sql 根据外键表和外键列得到主键表和主键列的方法
- sql-约束constraint(非空,唯一,主键,外键,检查)自学笔记
- 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句
- SQL 一个表中的两个外键来自于同一个表创建的视图