最近作工程时,须要用一条SQL查询一张表中不一样级别的字段(字段名称相同)。html
直接上例子吧sql
以下是地点表的部分截图,图1是全部的省份级别ui
图1:全部的省份级别spa
图2:部分城市级别
需求:用一条SQL同时查出城市id、城市name、省份id和省份name。.net
我写的SQL版本一以下unix
SELECT tlUp.LOCATION_ID as cityId, tlUp.LOCATION_NAME as cityName, tlDown.LOCATION_ID as provinceId, tlDown.LOCATION_NAME as provinceName FROM (SELECT tl.LOCATION_ID, tl.LOCATION_NAME, tl.SUPER_LOCATION_ID FROM t_location tl) tlUp,t_location tlDown WHERE tlUp.SUPER_LOCATION_ID = tlDown.LOCATION_ID
版本一查询出的结果code
我写的SQL版本二以下htm
SELECT tlOne.LOCATION_ID as cityId, tlOne.LOCATION_NAME as cityName, tlTwo.LOCATION_ID as provinceId, tlTwo.LOCATION_NAME as provinceName FROM t_location tlOne LEFT JOIN t_location tlTwo ON tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID
版本二查询出来的结果blog
我写的SQL版本三ci
SELECT tlOne.LOCATION_ID as cityId, tlOne.LOCATION_NAME as cityName, tlTwo.LOCATION_ID as provinceId, tlTwo.LOCATION_NAME as provinceName FROM t_location tlOne LEFT JOIN t_location tlTwo ON tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID AND tlOne.LOCATION_LEVEL = '2'
查询出的结果同版本二同样
别人写的SQL版本一以下
SELECT tlOne.LOCATION_ID as cityId, tlOne.LOCATION_NAME as cityName, tlTwo.LOCATION_ID as provinceId, tlTwo.LOCATION_NAME as provinceName FROM t_location tlOne LEFT JOIN t_location tlTwo ON tlOne.SUPER_LOCATION_ID = tlTwo.LOCATION_ID WHERE tlOne.LOCATION_LEVEL = '2'
查询出的结果同版本一 同样
别人写的SQL版本二以下
SELECT tlUp.LOCATION_ID as cityId, tlUp.LOCATION_NAME as cityName, tlDown.LOCATION_ID as provinceId, tlDown.LOCATION_NAME as provinceName FROM t_location tlUp,t_location tlDown WHERE tlUp.SUPER_LOCATION_ID = tlDown.LOCATION_ID
查询出的结果同版本一 一致
分析:
很明显,我写的版本1、别人写的版本1、版本二是对的。
仔细观察上述SQL会发现
我写的版本三和别人写的版本一惟一的区别在于on后面的条件链接关键词,我用的是ON,别人用的是where。这里延伸出一个问题:
left join on后面跟and和where的区别
阅读以下文章
http://blog.csdn.net/nsj820/article/details/6001718
http://blog.csdn.net/xingfeng0501/article/details/7816703
http://blog.chinaunix.net/uid-26982899-id-3284820.html
在使用left jion时,on和where条件的区别以下:
1.on后面and 条件表示先过滤以后,再链接
因此个人SQL版本二与SQL版本三查出的结果是同样的.
2.on后面where条件表示先关联以后,再过滤
因此别人写的SQL版本一是对的.