Member 14225726 Ответов: 2

SQL левое присоединение, включая значения null


Следующий код, приведенный ниже, используется для вывода данных из таблицы (weekly_data wd), но он также включает в себя нули. Мне нужно левое соединение из-за необходимости в других полях независимо от того, есть ли данные или нет. В том случае если есть данные как бы я исключил нулевые значения из еженедельных данных

Что я уже пробовал:

select sm.sugar_mill_name, mbz.mill, fhi.hczname as zone, sd.name as station, 
    round(coalesce(wd.dvalue, 0), 1) as Station_Reading
from sugar_mills sm join
     mill_by_zone mbz
     on sm.sugar_mill_name = mbz.mill join
     fca_hcz_info fhi
     on fhi.hcz = mbz.zone join 
     zone_by_station zbs
     on zbs.zone = fhi.hcz join 
     station_details sd
     on sd.station_num = zbs.station left join 
     weekly_data wd
     on wd.station_num = sd.station_num and
        wd.station_num = zbs.station and 
        wd.record_year = 2019 and
        wd.record_week = 19 and
        wd.dcode = 1;

2 Ответов

Рейтинг:
2

phil.o

Я не совсем уверен, и я не могу проверить это прямо сейчас, но я думаю, что на последнем (левом) соединении вы вводите элементы, которые, по-видимому, принадлежат a WHERE п. в JOIN заявление.
Может быть, попробуем:

select sm.sugar_mill_name, mbz.mill, fhi.hczname as zone, sd.name as station, 
    round(coalesce(wd.dvalue, 0), 1) as Station_Reading
from sugar_mills sm join
     mill_by_zone mbz
     on sm.sugar_mill_name = mbz.mill join
     fca_hcz_info fhi
     on fhi.hcz = mbz.zone join 
     zone_by_station zbs
     on zbs.zone = fhi.hcz join 
     station_details sd
     on sd.station_num = zbs.station left join 
     weekly_data wd
     on wd.station_num = sd.station_num
where wd.record_year = 2019 and
      wd.record_week = 19 and
      wd.dcode = 1;


Более того, wd.station_num уже присоединен к sd.station_num, которая сама соединяется с zbs.station; нет необходимости отчитываться за wd.station_num = zbs.station.

Надеюсь, это поможет.


Рейтинг:
0

Kornfeld Eliyahu Peter

Левое соединение - по замыслу - принесет нули для всех неудачных соединений... Поэтому, если вы ищете значение в объединенной таблице, которое не существует, оно не будет исключать исходную строку, а заполнит пробелы нулями...
Используйте внутреннее соединение - оно удалит все исходные строки, которые не имеют Соединенных строк в объединенной таблице...
http://www.sql-join.com/sql-join-types[^]