mysql select语句不返回未填充查询中某些表的行

时间:2013-08-09 15:44:44

标签: mysql

我有一个真正的头脑空白 - 除了那些我将st.station_id从值'1'更改为不同(但仍然有效)的数字但没有条目的条目之外,此代码非常好地选择行对于station_owner_map表,组织表或cap_gen_data_table中的station_id。我基本上需要修改我的sql以忽略任何没有条目的表。

Select st.station_id, st.station_name , st.st_town, st.st_state, c1.country_name,   o1.organisation_name, som1.equity, st.river_basin, st.cost, st.cost_ref, st.comm_year,cg1.caporgen, ht1.hydro_name, cg1.value, srs1.srs_description, cg1.ref_year
FROM station st
inner join station_country_map scm1 on st.station_id = scm1.station_id
inner join country c1 on scm1.country_id = c1.country_id
inner join station_owner_map som1 on st.station_id = som1.station_id
inner join organisation o1 on som1.owner_id = o1.org_id
inner join cap_gen_data cg1 on st.station_id = cg1.station_id
inner join value_lookup vl1 on cg1.caporgen = vl1.id
inner join hydro_type ht1 on cg1.hydro_type_id = ht1.type_id
inner join station_record_status srs1 on cg1.capacity_status = srs1.st_rec_stat_id
where st.station_id = 1

2 个答案:

答案 0 :(得分:2)

这是由inner join引起的。 Inner join表示两个表中都必须有一个值才能使记录显示在结果集中。

使用left join代替,然后只有左边的表格必须有值。

答案 1 :(得分:0)

对可能不存在值的表使用left联接。

如果您有两个表AB,则内部联接仅返回满足连接条件的A行。无论是否满足连接条件,left联接都将返回A的所有行。当使用左连接时,与B关联的select语句中的列将为null。

我只将left join添加到您指定的表格中。如果其他表可能不满足连接条件,则将连接类型从inner更改为left

Select st.station_id, st.station_name , st.st_town, st.st_state, c1.country_name,   o1.organisation_name, som1.equity, st.river_basin, st.cost, st.cost_ref, st.comm_year,cg1.caporgen, ht1.hydro_name, cg1.value, srs1.srs_description, cg1.ref_year
FROM station st
inner join station_country_map scm1 on st.station_id = scm1.station_id
inner join country c1 on scm1.country_id = c1.country_id
left join station_owner_map som1 on st.station_id = som1.station_id
left join organisation o1 on som1.owner_id = o1.org_id
left join cap_gen_data cg1 on st.station_id = cg1.station_id
inner join value_lookup vl1 on cg1.caporgen = vl1.id
inner join hydro_type ht1 on cg1.hydro_type_id = ht1.type_id
inner join station_record_status srs1 on cg1.capacity_status = srs1.st_rec_stat_id
where st.station_id = 1