SQL -- left join on and 与 left join on where的区别

最近作工程时,须要用一条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版本一是对的.

相关文章
相关标签/搜索