# left-join 的使用注意事项
在很多场景下我们需要同时查询多张表进行关联查询出我们想要的数据
下面是错误的写法:
说明:
为什么说这是错误的写法,原因是当 sql 往下执行的时候走到了左连接查询此时并无其它的条件,而只有一个条件那么就是
resource_code
是相同的数据我们就查,然后左连接查询出了关联resource_code
的所有数据在往下执行走到WHERE
的时候在进行条件筛选,此时又会过滤掉一些数据。
SELECT T | |
.ID, | |
T.project_id, | |
T.analysis_id, | |
T.YEAR, | |
T.resource_code, | |
T.resource_name, | |
T.administrative_division_name, | |
T.main_body, | |
T.gas_type, | |
( A.plan_supply_num - T.surrounding_sales_num - T.self_use_num ) AS one_access_volume, | |
T.surrounding_sales_num, | |
T.self_use_num | |
FROM | |
pro_bala_year_province_d_u_increase_china_gas T LEFT JOIN pro_bala_sup_year_china_gas_supply A | |
ON A.resource_code = T.resource_code | |
WHERE | |
T.analysis_id = '123' | |
AND A.YEAR = T.YEAR | |
AND T.analysis_id = A.analysis_id | |
AND T.administrative_division_code = A.administrative_division_code | |
ORDER BY | |
T.YEAR, | |
T.resource_code, | |
T.resource_name ASC; |
下面是正确的写法
说明:
sql 往下执行走到左连接的时候,先按照指定的条件筛选过滤掉想要的数据,再往下走筛选主表的数据查询出我们想要的数据,这种写法在走到左连接查询的时候并不是一口气把所有只有一个条件的数据都查询出来再往下执行
WHERE
的过滤条件的
SELECT T | |
.ID, | |
T.project_id, | |
T.analysis_id, | |
T.YEAR, | |
T.resource_code, | |
T.resource_name, | |
T.administrative_division_name, | |
T.main_body, | |
T.gas_type, | |
( A.plan_supply_num - T.surrounding_sales_num - T.self_use_num ) AS one_access_volume, | |
T.surrounding_sales_num, | |
T.self_use_num | |
FROM | |
pro_bala_year_province_d_u_increase_china_gas T LEFT JOIN pro_bala_sup_year_china_gas_supply A | |
ON A.resource_code = T.resource_code | |
AND A.YEAR = T.YEAR | |
AND T.analysis_id = A.analysis_id | |
AND T.administrative_division_code = A.administrative_division_code | |
WHERE | |
T.analysis_id = '123' | |
ORDER BY | |
T.YEAR, | |
T.resource_code, | |
T.resource_name ASC; |