MySQL левого соединения не работает правильно - PullRequest
2 голосов
/ 02 апреля 2012

Я хочу оставить объединение 2 таблицы.Таким образом, все атрибуты левой таблицы должны быть показаны в таблице результатов, независимо от того, может ли она объединиться с другой таблицей или нет.

Когда я выполняю следующие действия, я не получаю ожидаемый результат

week_table:
 date       kw note
 ---------- -- ----
 2012-04-01  0 NULL
 2012-04-02  0 NULL

fact_table:
id number_of_application number_of_cluster number_of_jvm number_of_node number_of_was fk_wasversion fk_date    fk_domain fk_osname fk_osarch fk_osversion fk_stage
 -- --------------------- ----------------- ------------- -------------- ------------- ------------- ---------- --------- --------- --------- ------------ --------
  1                   114                 8            80             18            18 6.0           2012-04-01 domain1   Linux     sparc     2            stage1
  2                   114                 8            80             18            18 6.0           2012-04-02 domain1   Linux     sparc     2            stage1
  3                   114                 8            80             18            18 6.0           2012-04-01 domain1   AIX       sparc     2            stage1
  4                   114                 8            80             18            18 6.0           2012-04-02 domain1   Solaris   sparc     2            stage1

Когда я делаю это:

select
  w.date,
  coalesce(sum(f.number_of_was), 0)
from 
  week_table w
    left join fact_table f on (w.date = f.fk_date) 
where f.fk_osname = "AIX" 
group by w.date;

Я получаю только:

 date       coalesce(sum(f.number_of_was), 0)
 ---------- ---------------------------------
 2012-04-01                                18

Ожидается:

date       coalesce(sum(f.number_of_was), 0)
---------- --------------------------------
2012-04-02                         18

Кто-то знает почему?

С наилучшими пожеланиями

Ответы [ 3 ]

11 голосов
/ 02 апреля 2012

Переместите критерии на внешней объединенной таблице из предложения WHERE в предложение ON:

select
  w.date,
  coalesce(sum(f.number_of_was), 0)
from 
  week_table w
    left join fact_table f on (w.date = f.fk_date and f.fk_osname = "AIX") 
group by w.date;
0 голосов
/ 02 апреля 2012

из-за where f.fk_osname = "AIX"

если данные не существуют в вашей правой таблице, это NULL, и вы просите получить только те строки, где fk_osname = "AIX" `

вы можете сделать WHERE (f.fk_osname = "AIX" OR f.fk_osname IS NULL)

0 голосов
/ 02 апреля 2012
where f.fk_osname = "AIX"

Я думаю, что есть только одна запись с этим именем?

...