美文网首页
left join on and where 和 left jo

left join on and where 和 left jo

作者: 墨色尘埃 | 来源:发表于2018-12-07 10:55 被阅读9次

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

left join on and where
左连接,pb_house表数据要比关联表数据多。
先过滤pb_community 、pb_xiaoqu 、pb_building表中IS_DELETE = 0的数据得到一张临时表A(表A的数据应该和pb_house表数据一样多)然后对这个临时表A作WHERE条件过滤,这里的条件只有一个,过滤之后的数据自然比left join on where and这种方式多。

SELECT
    ph.*, pc.COMM_NAME,
    px.XIAOQU_NAME,
    pbl.BUILD_NAME
FROM
    pb_house ph
LEFT JOIN pb_community pc ON ph.COMMUNITY_ID = pc.COMMUNITY_ID
AND pc.IS_DELETE = 0
LEFT JOIN pb_xiaoqu px ON ph.XIAOQU_ID = px.XIAOQU_ID
AND px.IS_DELETE = 0
LEFT JOIN pb_building pbl ON ph.BUILD_ID = pbl.BUILD_ID
AND pbl.IS_DELETE = 0
WHERE
    ph.IS_DELETE = 0

等同于以下,视图写法

SELECT
    `ph`.`HOUSE_ID` AS `HOUSE_ID`,
    `ph`.`HOUSE_NO` AS `HOUSE_NO`,
    `ph`.`RESIDENT_ID` AS `RESIDENT_ID`,
    `ph`.`OWNER_NAME` AS `OWNER_NAME`,
    `ph`.`COMM_RIGHT` AS `COMM_RIGHT`,
    `ph`.`HOUSE_ADDR` AS `HOUSE_ADDR`,
    `ph`.`HOUSE_NAME` AS `HOUSE_NAME`,
    `ph`.`HOUSE_AREA` AS `HOUSE_AREA`,
    `ph`.`FLOOR` AS `FLOOR`,
    `ph`.`LAYOUT_STRUCTURE_ID` AS `LAYOUT_STRUCTURE_ID`,
    `ph`.`HOUSE_PROPERTY_TYPE_ID` AS `HOUSE_PROPERTY_TYPE_ID`,
    `ph`.`HOUSE_PROPERTY_CARD` AS `HOUSE_PROPERTY_CARD`,
    `ph`.`HOUSE_STAT` AS `HOUSE_STAT`,
    `ph`.`HOUSE_USE` AS `HOUSE_USE`,
    `ph`.`HOUSE_TYPE` AS `HOUSE_TYPE`,
    `ph`.`HOUSE_NATURE` AS `HOUSE_NATURE`,
    `ph`.`IS_DELETE` AS `IS_DELETE`,
    `ph`.`DATA_SOURCE_ID` AS `DATA_SOURCE_ID`,
    `ph`.`BUILD_ID` AS `BUILD_ID`,
    `ph`.`XIAOQU_ID` AS `XIAOQU_ID`,
    `ph`.`COMMUNITY_ID` AS `COMMUNITY_ID`,
    `ph`.`ADM_DISTRICT_ID` AS `ADM_DISTRICT_ID`,
    `ph`.`ADM_STREET_ID` AS `ADM_STREET_ID`,
    `ph`.`COMM_GIS_ID` AS `COMM_GIS_ID`,
    `ph`.`SRC_UPDATE_TIME` AS `SRC_UPDATE_TIME`,
    `ph`.`FG_UPDATE_TIME` AS `FG_UPDATE_TIME`,
    `ph`.`UPDATE_TIME` AS `UPDATE_TIME`,
    `ph`.`ISBUILDING` AS `ISBUILDING`,
    `pc`.`COMM_NAME` AS `COMM_NAME`,
    `px`.`XIAOQU_NAME` AS `XIAOQU_NAME`,
    `pbl`.`BUILD_NAME` AS `BUILD_NAME`
FROM
    (
        (
            (
                `pb_house` `ph`
                LEFT JOIN `pb_community` `pc` ON (
                    (
                        (
                            `ph`.`COMMUNITY_ID` = `pc`.`COMMUNITY_ID`
                        )
                        AND (`pc`.`IS_DELETE` = 0)
                    )
                )
            )
            LEFT JOIN `pb_xiaoqu` `px` ON (
                (
                    (
                        `ph`.`XIAOQU_ID` = `px`.`XIAOQU_ID`
                    )
                    AND (`px`.`IS_DELETE` = 0)
                )
            )
        )
        LEFT JOIN `pb_building` `pbl` ON (
            (
                (
                    `ph`.`BUILD_ID` = `pbl`.`BUILD_ID`
                )
                AND (`pbl`.`IS_DELETE` = 0)
            )
        )
    )
WHERE
    (`ph`.`IS_DELETE` = 0)

left join on where and
这种方式先关联三张表得到一张临时表A(表A的数据应该和pb_house表数据一样多),然后对这个临时表A作WHERE条件过滤,因为这里不止一个过滤条件,需要同时满足这几个条件的数据才会出现,所以过滤之后的数据自然比left join on and where这种方式少。

SELECT
    ph.*, pc.COMM_NAME,
    px.XIAOQU_NAME,
    pbl.BUILD_NAME
FROM
    pb_house ph
LEFT JOIN pb_community pc ON ph.COMMUNITY_ID = pc.COMMUNITY_ID
LEFT JOIN pb_xiaoqu px ON ph.XIAOQU_ID = px.XIAOQU_ID
LEFT JOIN pb_building pbl ON ph.BUILD_ID = pbl.BUILD_ID
WHERE
    ph.IS_DELETE = 0
AND pc.IS_DELETE = 0
AND px.IS_DELETE = 0
AND pbl.IS_DELETE = 0

等同于视图

SELECT
    `ph`.`HOUSE_ID` AS `HOUSE_ID`,
    `ph`.`HOUSE_NO` AS `HOUSE_NO`,
    `ph`.`RESIDENT_ID` AS `RESIDENT_ID`,
    `ph`.`OWNER_NAME` AS `OWNER_NAME`,
    `ph`.`COMM_RIGHT` AS `COMM_RIGHT`,
    `ph`.`HOUSE_ADDR` AS `HOUSE_ADDR`,
    `ph`.`HOUSE_NAME` AS `HOUSE_NAME`,
    `ph`.`HOUSE_AREA` AS `HOUSE_AREA`,
    `ph`.`FLOOR` AS `FLOOR`,
    `ph`.`LAYOUT_STRUCTURE_ID` AS `LAYOUT_STRUCTURE_ID`,
    `ph`.`HOUSE_PROPERTY_TYPE_ID` AS `HOUSE_PROPERTY_TYPE_ID`,
    `ph`.`HOUSE_PROPERTY_CARD` AS `HOUSE_PROPERTY_CARD`,
    `ph`.`HOUSE_STAT` AS `HOUSE_STAT`,
    `ph`.`HOUSE_USE` AS `HOUSE_USE`,
    `ph`.`HOUSE_TYPE` AS `HOUSE_TYPE`,
    `ph`.`HOUSE_NATURE` AS `HOUSE_NATURE`,
    `ph`.`IS_DELETE` AS `IS_DELETE`,
    `ph`.`DATA_SOURCE_ID` AS `DATA_SOURCE_ID`,
    `ph`.`BUILD_ID` AS `BUILD_ID`,
    `ph`.`XIAOQU_ID` AS `XIAOQU_ID`,
    `ph`.`COMMUNITY_ID` AS `COMMUNITY_ID`,
    `ph`.`ADM_DISTRICT_ID` AS `ADM_DISTRICT_ID`,
    `ph`.`ADM_STREET_ID` AS `ADM_STREET_ID`,
    `ph`.`COMM_GIS_ID` AS `COMM_GIS_ID`,
    `ph`.`SRC_UPDATE_TIME` AS `SRC_UPDATE_TIME`,
    `ph`.`FG_UPDATE_TIME` AS `FG_UPDATE_TIME`,
    `ph`.`UPDATE_TIME` AS `UPDATE_TIME`,
    `ph`.`ISBUILDING` AS `ISBUILDING`,
    `pc`.`COMM_NAME` AS `COMM_NAME`,
    `px`.`XIAOQU_NAME` AS `XIAOQU_NAME`,
    `pbl`.`BUILD_NAME` AS `BUILD_NAME`
FROM
    (
        (
            (
                `pb_house` `ph`
                LEFT JOIN `pb_community` `pc` ON (
                    (
                        `ph`.`COMMUNITY_ID` = `pc`.`COMMUNITY_ID`
                    )
                )
            )
            LEFT JOIN `pb_xiaoqu` `px` ON (
                (
                    `ph`.`XIAOQU_ID` = `px`.`XIAOQU_ID`
                )
            )
        )
        LEFT JOIN `pb_building` `pbl` ON (
            (
                `ph`.`BUILD_ID` = `pbl`.`BUILD_ID`
            )
        )
    )
WHERE
    (
        (`ph`.`IS_DELETE` = 0)
        AND (`pc`.`IS_DELETE` = 0)
        AND (`px`.`IS_DELETE` = 0)
        AND (`pbl`.`IS_DELETE` = 0)
    )

两种方式的过程如下

微信图片_20181207104429_副本.jpg

有person表和student表,当person表→ student表是1对多的关系时,左连接数据变多。

person表.png student表.png
SELECT
    *
FROM
    person
LEFT JOIN student ON person.id = student.person_id
image.png

还是这两张表,当多对1的时候(多不是指数据多,而是对应关系)数据不会变多。

SELECT
    *
FROM
    student
LEFT JOIN person ON person.id = student.person_id
image.png

相关文章

网友评论

      本文标题:left join on and where 和 left jo

      本文链接:https://www.haomeiwen.com/subject/thizcqtx.html