# 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;