日期:2014-05-16  浏览次数:20627 次

关于INNER JOIN关联的问题
本帖最后由 z3453876 于 2014-05-06 01:09:47 编辑
例如有一个人员表:Person
表中有4个字段
ID、Name、CreateByUpdateBy
人员ID、人员姓名、创建这条记录的人员ID、最后一次修改这条记录的人员ID。

当然实际应用的时候不止这4个,这里只是就小弟的疑惑举个例子。

小弟自认为比较符合逻辑的做法。然而朋友认为我的做法不对。
于是还请各位大大指点一二,能够详细又通俗易懂最好了。
------------------------------------------------------------------------------------------
1、将CreateByUpdateBy设为外键关联Person表。
2、在查询的时候用到的sql语句


SELECT
姓名=A.[Name],
创建人姓名=B.[Name],
修改人姓名=C.[Name]
FROM Person A
INNER JOIN Person B ON B.ID=A.CreateBy
INNER JOIN Person C ON C.ID=A.UpdateBy


------------------------------------------------------------------------------------------
最后我要得到的效果,各位大大应该能看出来了。
为了达到这样的效果,我的这种写法各位大大会怎么评判呢?
在效率、性能等方面都有怎样的不足。
如果哪位大大通过我这短小的描述看出我走进了怎样的误区,更是感之不尽
------解决方案--------------------
如果没有任何条件的话,加不加外键没区别,就是同一个表扫三遍然后JOIN。
如果有A.ID=XXX的话,因为ID是主键,所以A上走索引查找,然后两个索引查找找到B和C,也没外键什么事。

外键最大的用处是级联更新删除之类的,查找效率在你这个案例上真看不出有什么用。
------解决方案--------------------
这种做法正确啊,也可以写个函数通过id取姓名

------解决方案--------------------
你这三个ID都是同一张表,建议你使用 两个 left join ,自己创建自己这个说法不大通。
------解决方案--------------------
还有一种方式,是可以在你的表中可以适当的增加一些冗余。
ID、Name、CreateBy、CreateByName,UpdateBy,UpdateByName。
如果你上面的查询经常使用的话,效率还是会有影响,但是适当的增加冗余的话,就能节省这方面的开销,就是平常维护的时候稍微麻烦写。这个需要有一个取舍
------解决方案--------------------
这个没什么不对的啊 也没感觉出有什么要优化的 改成left join更好点
------解决方案--------------------
引用:
这个没什么不对的啊 也没感觉出有什么要优化的 改成left join更好点

这是正解吧,先要搞清楚要的业务数据是什么吧。如果用内联,那要是管理表数据不存在了,那就得不到业务数据了。